1

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

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

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

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

4

4 回答 4

2

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

你有三个选择:

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

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

于 2012-04-07T15:50:15.793 回答
1

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

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

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

于 2012-04-07T16:42:22.367 回答
0

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

以下链接可能有用:

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

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

于 2012-04-07T18:00:19.663 回答
0

是我波宗。我仍在调查这个非常愚蠢的问题。

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

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

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

于 2012-04-11T08:58:27.840 回答