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

时间:2012-04-07 15:20:52

标签: c# .net visual-studio-2010 .net-assembly

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

我使用References-> Add Reference-> Browse添加对库的引用。我可以看到在项目文件中一切都很好:             .... \ BIN \ utils的\ log4net.dll        假     

我想在不使用“复制本地”选项的情况下引用第三方库。但是,如果我不使用该选项,则找不到库,我会得到例外。

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

4 个答案:

答案 0 :(得分:2)

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

您有三种选择:

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

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

答案 1 :(得分:1)

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

例如,如果您的应用程序基目录为C:\MyFramework,那么您可以将程序集放在C:\MyFramework\bin中。

查看this文章,了解CLR如何搜索程序集。

答案 2 :(得分:0)

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

以下链接可能有用:

C# - Correct Way to Load Assembly, Find Class and Call Run() Method

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

答案 3 :(得分:0)

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

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

我找到的一个可能的解决方案是定义环境变量DEVPATH(参见此处http://msdn.microsoft.com/en-us/library/cskzh7h6.aspx),但事实证明.net4在独立运行程序集时(在visual studio之外)不使用此变量,或者至少对我来说就是这种情况 - 我无法使其发挥作用。

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