11

我正在尝试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

这是第二种情况的目录结构

4

3 回答 3

11

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

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

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

于 2012-05-23T15:13:03.950 回答
3

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

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

但是 (引自文章)

使用 /lib 的替代方法是将任何所需的程序集复制到工作目录中;这将允许您简单地将程序集名称传递给 /reference。然后,您可以从工作目录中删除程序集。由于程序集清单中未指定依赖程序集的路径,因此可以在目标计算机上启动应用程序,并将在全局程序集缓存中查找并使用程序集。

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

所以乔恩斯基特的回答更好。(我只是添加这个以提供比我在评论中更多的信息,而不是作为答案。乔恩的答案是最好的 IMO)

于 2012-05-23T15:15:58.647 回答
1

您可以在库文件夹中创建指向程序集的符号链接,这样您只需在一个位置更新它们。

于 2017-08-31T18:00:26.540 回答