我有一个Visual Studio 2010 C#项目,它创建一个.exe,这个项目正在使用一些第三方类库。 我的项目位于:/ MyFramWork / tests / test1 第三方库位于:/ MyFrameWork / bin / utils /
我使用References-> Add Reference-> Browse添加对库的引用。我可以看到在项目文件中一切都很好: .... \ BIN \ utils的\ log4net.dll 假
我想在不使用“复制本地”选项的情况下引用第三方库。但是,如果我不使用该选项,则找不到库,我会得到例外。
我的问题是:有没有办法指定应该在.... \ bin \ utils找到第三方库。似乎当.exe构建时,.csproj中的信息会丢失。
答案 0 :(得分:2)
默认情况下,.NET应用程序仅在两个位置查找其依赖项:EXE目录和GAC(全局程序集缓存)。
您有三种选择:
gacutil
将相关性安装到GAC中。如果您的依赖关系不会改变,这将是一个很好的选择,将在每个开发机器上的不同位置(即,如果相对路径不能正常工作),并且如果您想从许多不同的地方使用它项目。但如果依赖性仍在积极发展并经常变化,那将是一个巨大的痛苦。您还需要确保在将应用程序部署到的每台计算机上将DLL放入GAC。通常,您只需使用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
答案 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目录中而不使用子目录的解决方案是最好的。我想我会放弃,就这样做。