我正在尝试用Growl C# API
编写一个简单的c#
程序。
我试着用两种不同的方法来编译我的程序:
1.我把我的.dll
文件和我的.cs
文件放在同一个目录下。
csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs
字符串
它编译得很好,运行也很好。
1.现在,我已经在当前的工作目录中创建了一个名为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)
型
所以,我的问题是,当文件在外部文件夹中时,在csc
中引用.dll
文件的正确方法是什么?
下面是第二种情况下的directory structure。
3条答案
按热度按时间rekjcdws1#
所以,我的问题是什么是正确的方式来引用.dll文件在CSC中时,文件在外部文件夹中。
你已经在 * 构建 * 时引用了它们。你只需要在 * 执行 * 时也使它们可用,但是当你想运行它时,把它们复制到与可执行文件相同的目录中。
如果这些程序集是签名的,你也可以使用全局程序集缓存来调查,但我个人坚持只将可执行文件与它所依赖的库一起保存。
n3schb8v2#
您可以在编译时使用/lib和/reference命令行开关添加它们。
http://msdn.microsoft.com/en-us/library/s5bac5fx.aspx
使用/lib的替代方法是将任何所需的程序集复制到工作目录中;这将允许您仅将程序集名称传递到/reference。然后可以从工作目录中删除程序集。由于程序集清单中未指定依赖程序集的路径,因此可以在目标计算机上启动应用程序,并将在全局程序集缓存中查找和使用该程序集。
因为编译器可以引用程序集,所以这并不意味着公共语言运行库将能够在运行时查找和加载程序集。有关运行库如何搜索引用的程序集的详细信息,请参见公共语言运行库如何查找程序集。
所以Jon Skeet的答案更好。(我只是添加这个来提供更多的信息,而不是作为一个答案。Jon的答案是最好的IMO)
kg7wmglp3#
您可以为libraries文件夹中的程序集创建symlinks,这样您只需要在一个位置更新它们。