2012-05-23 85 views
5

我正在嘗試使用Growl C# API做一個簡單的c#程序。csc.exe參考外部.dll文件

我試圖編譯我的程序以兩種不同的方式:

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

回答

9

所以,我的問題是當文件位於外部文件夾中時,在csc中引用.dll文件的正確方法是什麼。

你已經在建立時間引用它們。你只需要讓它們在執行時也可用,但是當你想運行它時將它們複製到與可執行文件相同的目錄中。

你也可以使用全局程序集緩存進行調查,如果它們是簽名的程序集,但是我個人堅持只保留它所依賴的庫的可執行文件。

+0

因此,我無法將'.dll'文件保存在外部文件夾中,只需雙擊''.exe'即可。正如我從你的回答中所理解的那樣,'.dll'文件應該在運行時與.exe位於同一文件夾中。 – RanRag

+0

@Noob:如果你添加一個app.config文件來指定私人bin路徑探測,我相信它可能在*子目錄*,但這只是增加了更多的複雜性。如果一切都在同一個目錄中,那麼所有*更簡單。 –

+0

感謝您的信息。 – RanRag

1

您可以在編譯時使用/ lib和/ reference命令行開關添加這些開關。

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

但是(報價從製品)

使用/ lib中的替代方法是複製到工作目錄任何 所需的程序集;這將允許你簡單地通過組裝 名稱/參考。然後可以從 工作目錄中刪除程序集。由於程序集清單中指定的從屬程序集的路徑不是 ,因此可以在目標計算機的 上啓動應用程序,並將在全局程序集高速緩存中找到並使用該程序集。

因爲編譯器可以引用程序集並不意味着 公共語言運行庫將能夠在運行時查找並加載程序集 。有關運行時如何搜索引用程序集的詳細信息,請參閱運行時定位程序集。

所以Jon Skeet的回答比較好。 (我只是添加這個提供更多的信息比我可以在評論中,而不是作爲答案。Jon的答案是最好的國際海事組織)

0

您可以創建symlinks到您的庫文件夾中的程序集,所以你只需要讓他們在一個位置更新。