2015-12-03 42 views
2

我有一個可能存在也可能不存在的引用項目。我有使用該引用的代碼,並且只想在程序集存在的情況下編譯它。我在想的東西沿着線:C#條件編譯,如果程序集存在

#if ASSEMBLY_EXISTS 
    AssemblyClass.DoSomething(); 
#endif 

我可以把#定義在頂部,並根據需要註釋/取消註釋,但我更喜歡,如果它可能只是在某種程度上知道如果它不存在我的手動干預,這導致我相信#if不適合這種情況。根據程序集是否存在,是否有另一種有條件編譯的方法?

+0

嘗試,抓住,最後?我假設你會得到一個對象ref。沒有設置爲對象異常的實例,所以有一個特定的catch塊來處理等。不是一個非常有效的方法,但我不知道這個代碼是必需的快。 –

+0

@stuartd,是不是在運行時檢查鏈接? – TTT

+0

沒有可用於存在引用程序集的預編譯符號。 –

回答

5

也許它與MSBUILD內的條件;

它看起來像它

<PropertyGroup> 
    <DefineConstants Condition="Exists('my.dll') ">$(DefineConstants);DLLEXISTS</DefineConstants> 
</PropertyGroup> 

,應該走很遠倒在你的.csproj的文件。

這讀取,大致爲「通過附加DLLEXISTS重新定義的常量,如果my.dll存在」

現在,你應該能夠做到

#if DLLEXISTS 
    // your stuff here 
#endif 

您可能需要反覆折騰EXISTS表達式來查找適當的相對路徑。

+0

這工作完美。對於Exists目錄,由於引用包含在項目中,我只是精確地複製了它的路徑。 – TTT

+0

工程很好! MsBuild/.csproj文件可以通過卸載項目並右鍵單擊它然後單擊編輯來訪問... http://doc.postsharp.net/configuration-msbuild – Zunair

1

不,你不能這樣做。 您不能在編譯時定義條件編譯符號的結果。

如果你想得到花哨,你可以寫一個新的程序,檢測缺失的程序集並修改你的源代碼。然後,您可以在項目的預生成事件中執行該程序。

源代碼的修改可能只是在源文件的頂部添加或刪除您建議的#define。

+0

我喜歡你的「想象」想法。如果沒有簡單的方法,這顯然會起作用,並且看起來像是一個很好的後備。 – TTT