引用不在根位置的第三方程序集

本文关键字:第三方 程序集 位置 引用 | 更新日期: 2023-09-27 18:30:16

我有一个Visual Studio 2010 C#项目,它创建了一个.exe并且该项目正在使用一些第三方类库。我的项目位于:/MyFramWork/tests/test1第三方库位于:/MyFrameWork/bin/utils/

我正在使用引用->添加引用->浏览添加对库的引用。我可以看到在项目文件中一切都很好: ....''bin''utils''log4net.dll 假

我想在不使用"复制本地"选项的情况下引用第三方库。但是,如果我不使用该选项,则找不到该库,并且会出现异常。

我的问题是:有没有办法指定应该在....''bin''utils找到第三方库。似乎当.exe构建时,来自.csproj的信息会丢失。

引用不在根位置的第三方程序集

默认情况下,.NET 应用仅在两个位置查找其依赖项:EXE 目录和 GAC(全局程序集缓存)。

您有三种选择:

  • 您可以确保将依赖项复制到与 EXE 相同的目录中(这是 Copy Local 所做的)。大多数情况下,这是最佳选择,这就是为什么当您引用尚未在 GAC 中的程序集时,它是默认值的原因。
  • 您可以使用 gacutil 将依赖项安装到 GAC 中。如果您的依赖项不会更改,将位于每台开发计算机上的不同位置(即,如果相对路径不能很好地工作),并且如果您想从许多不同的项目中使用它,这可能是一个不错的选择。但是,如果依赖项仍在积极开发中并且经常更改,则这是一个很大的痛苦。你还需要确保将 DLL 放入将应用部署到的每台计算机上的 GAC 中。
  • 您可以自定义依赖项加载行为,使其在其他地方看起来,正如 Hans 在他的评论中指出的那样。这是一个高级选项,并带来了一系列全新的头痛。

通常,你只会使用Copy Local;这是一个非常明智的默认值。你应该需要一个相当令人信服的理由来做任何不同的事情。

使用 <probing> 元素指定 CLR 应在何处搜索程序集。唯一的限制是程序集必须位于应用程序基目录的子目录中。

例如,如果应用程序基目录为 C:'MyFramework ,则可以将程序集放在 C:'MyFramework'bin 中。

请查看本文以了解 CLR 如何搜索程序集。

如果需要从自定义位置加载程序集,可以尝试 Assembly.LoadFile 方法。

以下链接可能有用:

C# - 加载程序集、查找类和调用 run() 方法的正确方法

http://www.csharp-examples.net/reflection-examples/

我Potzon。 我仍在调查这个令人难以置信的愚蠢问题。

我一直希望有一些优雅的解决方案。我即将构建相当大的框架,其中包含许多程序集,这些程序集将放置在/Framework/bin/中。但是,我想在目录中有一些目录结构,例如/bin/utils,/bin/test,/bin/devices/等。

我发现的一种可能的解决方案是定义环境变量 DEVPATH(请参阅此处 http://msdn.microsoft.com/en-us/library/cskzh7h6.aspx),但事实证明,当程序集独立运行时(在 Visual Studio 之外),.net4 没有使用此变量,或者至少对我来说是这种情况 - 我无法让它工作。

似乎将所有程序集放在/bin 目录中而不使用子目录的解决方案是最好的。我想我会放弃,就这样做。