将C#DLL加载到C ++ / CLI - dependencies目录

时间:2013-07-25 19:48:04

标签: c# dll dependencies

我写了一个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上工作。

1 个答案:

答案 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分钟来完成这项工作。

虽然不在这台机器上,否则我已粘贴在代码中。