托管的C dll调用C#dll,FileNotFoundException
Managed C dll calling C# dll, FileNotFoundException
我有一个应用程序环境,它本质上是一个插件,其中:
主机应用程序调用非托管c++dll,该dll调用托管c++dll并调用c#dll
这是一种通过使用托管C++的桥接从未托管C++调用C#的方法。这一切在大多数情况下都能很好地工作,除了在插件类型体系结构中,我的dll(非托管C++、托管C++和C#)与调用dll的应用程序不在同一目录中。当应用程序调用非托管C++时,一切都很好,因为应用程序知道要调用哪个目录来加载dll。然而,当非托管C++第一次调用托管C++时,我们会得到一个FileNotFoundException。事实证明,它没有找到C#dll(注意,所有三个dll都在同一目录中,只是不在应用程序目录中)。如果我把所有的dll都放在exe的运行时目录中,那么一切都很正常,我们不会得到FileNotFoundException。但是当我部署时,我将无法控制调用的应用程序,因此无法将我的dll放在运行时目录中。
因此,问题是,当托管C++dll加载时,我如何在非托管C++代码中以编程方式设置C#dll的加载目录?我尝试过SetDllDirectory,并将系统上的路径变量设置为我的dll所在的目录无效。
CLR默认情况下只在两个位置查找程序集:GAC第一个,EXE启动的目录第二个。让它去别处寻找需要额外的工作。一种可能性是,您无法为AppDomain订阅事件处理程序。AssemblyResolve在此方案中。这会留下一个包含<probing>
或<codebase>
元素的app.exe.config文件。您必须将其命名为与非托管EXE相同的名称,并将其存储在与EXE相同的文件夹中。
如果EXE不是您的,并且没有完全解决将内容排除在EXE目录之外的目标,那么这往往是不明智的。GAC是一个简单的解决方法。
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Python ctypes:不会按预期加载 dll
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL