2009-05-19 97 views
4

我正在編譯csc.exe(好吧,CruiseControl是...),我需要在GAC中引用一個DLL。我沒有將此DLL的正確版本作爲簡單文件,但在GAC中有正確的版本。如何使用GAC'd程序集作爲csc.exe的參考?

但是,您無法使用csc引用GAC中的程序集 - 您必須具有實際文件的路徑。

我發現了一些聲稱可以反向設計實際文件路徑的參考,但是我一直無法讓它們工作。我啓動了Fusion日誌記錄,並且可以看到運行時從哪裏獲取文件,但在我的引用中使用到該位置的文件路徑不起作用。

那麼,您如何提供csc引用僅存在於GAC中的彙編版本?

回答

3

我有類似的問題。我使用的解決辦法是打開命令提示符,並將目錄更改爲類似以下的(這取決於哪個組件您想更改):

 
C:\WINDOWS\assembly\GAC_MSIL\System.Web.Extensions\3.5.0.0__31bf3856ad364e35\ 

您可以在此目錄中的某個地方然後複製GAC外的DLL。

+0

是的,這是關鍵 - 我不得不在命令提示符下導航到該文件夾​​,然後*將DLL複製到其他地方*。出於某種原因,您無法將該文件夾路徑放入CruiseControl的CSC任務中。但是,如果您將DLL複製出來(並更改權限),則可以很好地引用它。 – Deane 2009-05-19 21:42:44

0

當我針對Excel PIA編譯時,我使用此路徑在csc.exe的命令行中指定引用: C:\ windows \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 11.0.0.0 __71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll

編譯成功。

?? 這不適合你嗎?

+0

我認爲這是你的網站在那裏我瞭解這一點,因爲Office互操作性的東西作爲一個例子。 但是,沒有 - 這沒有奏效。我查看了Fusion日誌,我的情況略有不同:它是「GAC_MSIL」,而不僅僅是「GAC」。但是,無論如何,這兩條道路都沒有奏效。 – Deane 2009-05-19 21:20:17

+0

令人失望。重新:「這兩條路都沒用。」那麼,只有一條路徑是正確的道路。你有沒有證實該DLL實際存在於該路徑?我想,這需要一個命令行。您必須將CD放入Microsoft.Office.Interop.Excel目錄中,然後找到包含所有這些數字的路徑的其餘部分,我認爲這些數字因版本和機器而異。一旦你確認了路徑,你可以用csc.exe/r重試:? – Cheeso 2009-05-19 23:46:38

3

我建議使用Nant或MSBuild,並使用visual studio生成的.csproj文件。然後簡單地讓CruiseControl使用你的Nant腳本。下面是從南特腳本,我寫了一個提取物,

<csc target="library" output="${basedir}/bin/${basename}.dll" debug="${debug}" optimize="true"> 
    <sources> 
    <include name="src/app/**/*.cs"/> 
    </sources> 
    <references refid="My.Assemblies" /> 
</csc> 

和引用

 <assemblyfileset id="My.Assemblies"><include name="System.dll"></include> 
    <include name="System.Configuration.dll"></include> 
    <include name="System.Core.dll"></include> 
    <include name="System.Data.dll"></include> 
    <include name="System.Data.DataSetExtensions.dll"></include> 
    <include name="System.Drawing.dll"></include> 
    <include name="System.EnterpriseServices.dll"></include> 
    <include name="System.Web.dll"></include> 
    <include name="System.Web.Extensions.dll"></include> 
    <include name="System.Web.Mobile.dll"></include> 
    <include name="System.Web.Services.dll"></include> 
    <include name="System.Xml.dll"></include> 
    <include name="System.Linq.dll"></include> 
</assemblyfileset>