.NET控制台应用程序如何查找引用的程序集?

时间:2009-07-31 19:02:42

标签: c# dll console

我使用引用外部DLL的C#创建了一个控制台应用程序。当我在我的开发机器上运行它时,一切正常。在生产机器上,我收到“类型初始化”错误。看看这个,似乎可能是因为应用程序无法找到引用的DLL。

在我的开发框中,引用的DLL位于GAC中,但不在生产中。在开发框中从GAC中删除DLL时,会发生同样的错误(除非我在调试模式下从本地Visual Studio构建运行它)。

我对网站设置比较熟悉,并且知道DLL可以放在bin目录或GAC中,以便Web应用程序可以找到它们。但我不确定这对控制台应用程序有何用处。

我不愿意将DLL放到生产盒上的GAC中,因为它只需要这个小应用程序。我是否有其他方法可以部署控制台应用程序并让它找到所需的程序集?

以下是我得到的例外情况:

  

错误1找不到类型或命名空间名称“Entry”(是吗?   缺少using指令或程序集引用?)C:\ Documents and   Settings \ Hacker \ My Documents \ Visual Studio   2005 \ Projects \ basic \ basic \ Program.cs 10 8 basic

5 个答案:

答案 0 :(得分:11)

最简单的答案是将DLL放在与控制台应用程序相同的目录中,它会找到它们。

较长的答案相当复杂,因为有很多因素会影响CLR查找引用程序集的方式和位置。我建议您查看MSDN中的以下文章,该文章详细介绍了它的工作原理。

答案 1 :(得分:3)

- Right click on the assembly name in your project reference.
- select Properties
- In the properties window set CopyLocal to true

答案 2 :(得分:2)

GAC(Global Assembly Cache)注册您的.dll,因此您不必将它们放在应用程序的工作目录中。所有.NET的.dll(System.IO.dll,System.dll等)都是通过GAC注册的,这意味着您不必将它们放在应用程序的目录中。默认情况下,如果.dll未在GAC中注册,则程序将在其自己的目录中查找缺少的.dll。

所以,你有三个选择:

  1. 将您引用的.dll添加到GAC或
  2. 将引用的.dll添加到应用程序的工作目录中
  3. 转到您对解决方案/项目的参考资料,并选择该参考的属性,设置“CopyLocal = true”(以上为此归功于Partha)

答案 3 :(得分:0)

当您检查所获得的异常时(您可能需要深入了解内部异常),您应该看到所有搜索位置的日志(“融合日志”)。

我建议只将依赖的DLL放在与控制台应用程序相同的目录中。

答案 4 :(得分:0)

您可以根据需要部署引用的dll。 您必须向基础项目添加App.config(添加/新项目/应用程序配置文件)并使用标记探测(configuration / runtime / assemblybinding / probing)来指示dll的路径。

您必须将dll或dll复制到该路径并在项目中添加对它的引用。在引用属性中将“copy local”设置为“false”。