c# - 从 C#/.NET 程序集中,如何加载加载非托管 DLL 的 C++/CLR DLL?
问题描述
我有一个包含以下项目的 Visual Studio 2017 解决方案:
CppClrQuestion -- Solution
CUnamagedLib -- C++ Unmanaged Windows DLL
CUnmanagedLib.cpp
CUnmanagedLib.h
ClrManagedLib -- C++/CLR DLL Project
ClrManagedLib.cpp
ClrManagedLib.h
CSharpDotNetConsoleApp -- C#/.NET
Program.cs
CSharpDotNetConsoleApp
具有对 的项目引用ClrManagedLib
和ClrManagedLib
对 的项目引用CUnamagedLib
。
一切编译正常。但是,当我运行 C# 应用程序时,我得到了这个异常:
System.IO.FileNotFoundException: 'Could not load file or assembly 'CppClrLib2.dll' or one of its dependencies. The specified module could not be found.'
如果我进行更改ClrManagedLib
以使其不调用任何内容CUnamagedLib
,则它运行正常。
如何设置一个解决方案,其中我有一个引用托管 C++/CLR 库的 C# 应用程序,该库然后引用非托管 C++ 库?
供参考,以下是源文件内容:
CUnmanagedLib.cpp
#include "stdafx.h"
__declspec(dllexport) int GetNumUnmanaged(void) {
return 5;
}
CUnmanagedLib.h
#pragma once
__declspec(dllimport) int GetNumUnmanaged(void);
ClrManagedLib.cpp
#include "stdafx.h"
#include "..\CUnamangedLib\CUnmanagedLib.h"
#include "ClrManagedLib.h"
int ClrManagedLib::Class1::GetNum() {
return GetNumUnmanaged();
}
ClrManagedLib.h
#pragma once
using namespace System;
namespace ClrManagedLib {
public ref class Class1
{
public:
int GetNum();
};
}
程序.cs
namespace CSharpDotNetConsoleApp {
class Program {
static void Main(string[] args) {
var managedObj = new ClrManagedLib.Class1();
}
}
}
解决方案
Windows 将识别所需的非托管 DLL,但它只在几个地方查找它。确保那里有一份副本。在过去,每个人都将所有内容都堆放在 Windows\System32 子文件夹中。不要那样做。详细 信息: https ://msdn.microsoft.com/en-ca/library/7d83bc18.aspx 更多详细信息: https ://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-搜索顺序
推荐阅读
- ios - 球不能在圆形精灵迅速中随机方向移动
- angular - 无法理解 Angular 6 错误
- python - 如何从这个亚马逊模板中提取平均星级?(python,网络抓取)
- git - 为什么当我提交到服务器其他文件时上传 laravel.log 文件
- asp.net-mvc - 从 MVC 中的文本文件中读取
- laravel - Laravel 5.6 - 在控制器中按名称获取路由
- php - 带有for循环的php中的贷款分期付款
- css - 如何使用 postCSS 创建基于 HTML 类的 CSS 颜色主题解决方案
- php - 将字符串与 [PHP] 之间的标签一起分解
- javascript - Modx revo regClientStartupScript 404