csc.exe引用外部.dll文件

时间:2012-05-23 15:10:55

标签: c# windows csc

我正在尝试使用c#创建一个简单的Growl C# API程序。

我尝试用两种不同的方式编译我的程序:

1)我将.dll文件保存在与.cs文件相同的目录中。比我跑

csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs

编译得很好,也很好。

2)现在我在当前工作目录中创建了一个名为growl的目录,并在那里保留了所有.dll个引用。

现在,当我尝试使用以下命令编译它时

csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D:
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs

编译得很好,但是当我试图运行它时,发生了下面提到的异常。

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified.
 at GrowlNotification.Program.Main(String[] args)

所以,我的问题是当文件在外部文件夹中时,.dll中引用csc文件的正确方法是什么。

以下是第二种情况的directory structure

3 个答案:

答案 0 :(得分:10)

  

所以,我的问题是当文件在外部文件夹中时,在csc中引用.dll文件的正确方法是什么。

您已经在 build 时间引用了它们。您只需要在执行时间使它们可用,但是当您想要运行它们时,将它们复制到与可执行文件相同的目录中。

如果这些是已签名的程序集,您还可以使用全局程序集缓存进行调查,但我个人仍然坚持将可执行文件与其所依赖的库保持在一起。

答案 1 :(得分:2)

您可以在编译时使用/ lib和/ reference命令行开关添加这些。

http://msdn.microsoft.com/en-us/library/s5bac5fx.aspx

但是 (引自文章)

  

使用/ lib的另一种方法是复制到工作目录中   所需组件;这将允许您简单地传递程序集   name to / reference。然后,您可以从中删除程序集   工作目录。由于依赖程序集的路径不是   在程序集清单中指定,应用程序可以启动   目标计算机,将在全局中找到并使用程序集   汇编缓存。

     

因为编译器可以引用程序集并不意味着   公共语言运行库将能够找到并加载程序集   运行。有关如何使用的详细信息,请参阅运行时如何查找程序集   运行时搜索引用的程序集。

所以Jon Skeet的回答更好。 (我只是添加这个以提供比评论更多的信息,而不是作为答案.Jon的答案是最好的IMO)

答案 2 :(得分:1)

您可以为库文件夹中的程序集创建symlinks,这样您只需要在一个位置更新它们。