正在将C#DLL加载到C++/CLI依赖项目录中
本文关键字:依赖 CLI 项目 C++ C#DLL 加载 | 更新日期: 2023-09-27 18:24:54
我写了一个dll c++/cli库,它使用了我的另一个c#dll库。当我将C#dll与调用它的应用程序放在同一文件夹中时,C++/cli库可以正常工作。这个库最终将加载到许多应用程序中,并且C#dll不能与应用程序一起复制到目录中。它必须与c++/cli库位于同一文件夹中,但在这种情况下,我得到了System.IO.FileNotFoundException。我的建议是手动加载c#库,或者更改f.ex.firebox查找依赖项的路径,但我尝试使用LoadLibrary()和Assembly::LoadFrom()方法强制从正确的目录加载。当然,我在系统path中添加了带有dll的目录路径。我在VS2010上工作。
您不会更改应用程序查找dll的默认目录。
在设计时,将你的dll放在某个众所周知的位置,即你要部署到的位置。添加对它的引用,确保它设置为"永远不要复制",否则它将最终进入bin文件夹。你必须这样做,否则它将无法编译。
部署时,需要一个包来部署通用dll,每个应用程序需要一个。如果与AppB 相比,appA需要旧版本或新版本的通用dll,请注意不要创建自己版本的dll地狱
将AppDomain.AssemblyResolve事件添加到main(对于windows应用程序)。在运行时,当您引用dll中的类型并且程序集尚未加载时,事件处理程序将被激发。
在那里,你可以从著名的位置加载它。通常在配置或相对路径中。
E.g.
AllMyApps
CommonDLLS
MyFirstApp
因此,从中加载所需公用dll的路径将是"..''CommonDlls''MyCommondll.dll".
注意,你会想以某种方式保护dll,否则坏人可能会将他们版本的dll注入你的应用程序,这将是糟糕的。。。
您也可以使用此机制从远程服务器或数据库blob获取dll。
最简单的情况是只有几行代码,只需查找事件即可。在类似的情况下,我花了大约15分钟才完成。
但这台机器上没有,否则我会把代码粘贴进去的。