我正在尝试使用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。
答案 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,这样您只需要在一个位置更新它们。