我写了一个dll c ++ / cli库,它使用我的其他c#dll库。当我在与调用它的应用程序相同的文件夹中使用c#dll时,C ++ / cli库工作正常。该库最终将加载到许多应用程序中,并且不能将C#dll复制到带有应用程序的目录中。它必须与c ++ / cli库位于同一文件夹中,但在这种情况下,我有System.IO.FileNotFoundException。 我的建议是手动加载c#库或更改f.ex.的路径。 firefox正在寻找依赖项,但我尝试使用LoadLibrary()和Assembly :: LoadFrom()方法来强制从正确的目录加载。当然,我将带有dll的目录路径添加到系统PATH。 我在VS2010上工作。
答案 0 :(得分:1)
您不会更改应用程序查找dll的默认目录。
在设计时将您的dll放在一个众所周知的位置,即您要部署到的位置。添加对它的引用,确保它设置为Do not copy ever,否则它将最终在bin文件夹中。你必须这样做,否则它将无法编译。
部署时,您需要一个软件包来部署公共dll,并为每个应用程序分配一个软件包。小心你不创建自己的dll地狱版本,如果appA需要旧版本或新版本的通用dll,与AppB相比
将AppDomain.AssemblyResolve事件添加到main(适用于Windows应用)。在运行时,当您在dll中引用类型时,事件处理程序将被触发,并且尚未加载程序集。
在那里你从众所周知的位置加载它。通常在配置或相对路径中。
E.g.
AllMyApps
CommonDLLS
MyFirstApp
因此,加载所需公共dll的路径为“.. \ CommonDlls \ MyCommondll.dll”。
请注意,您需要以某种方式保护dll,否则坏人可能会将其版本注入您的应用中,这样会很糟糕......
您也可以使用此机制从远程服务器或数据库blob获取dll。
最简单的情况只是几行代码,只是查看事件。在类似的情况下,我花了大约15分钟来完成这项工作。
虽然不在这台机器上,否则我已粘贴在代码中。