2009-06-04 72 views
1

我最近發現需要檢查編譯時是否:a)某個程序集引用存在並且可以成功解析,或b )定義了某個類(其全名是已知的)。這兩種情況對我而言是相同的,所以能夠檢查其中一個就足夠了。有沒有辦法在.NET/C#中做到這一點?預處理器指令最初讓我感到有些幫助,但它似乎沒有必要的能力。在編譯時檢查是否存在引用/類型

當然,檢查一個類型在運行時的存在可以做到很輕鬆了,但不幸的是,這將無法解決在這種情況下我的具體問題。 (我需要能夠忽視的事實是有一定的參考丟失,因此回退在代碼中的另一種方法。)

回答

1

我似乎已經在這裏找到了解決辦法,雖然不正是我最初希望。

我的解決方案:

我最終什麼事做的是創建一個新的生成配置,然後定義一個預編譯不變,這是我在代碼中使用,以確定是否使用了引用,或回落至替代(保證工作)的方法。它不是完全自動的,但它相對簡單,看起來非常高雅 - 足以達到我的目的。

備選:

如果你想完全自動化這一點,可以使用運行批處理腳本/小程序的預生成命令檢查機器上給定參考的庫存情況來完成,然後更新包含預編譯器常量的文件。不過,我認爲這比值得付出更多努力,但如果我有多個需要解決的獨立引用(檢查可用性),它可能會更有用。

1

有沒有什麼不能添加引用,然後使用typeof運算表達式的理由來自程序集的類型以驗證它是否可用?

var x = typeof(SomeTypeInSomeAssembly); 

如果包含SomeTypeInSomeAssembly組件不被引用,並可用此將不編譯。

+0

是的。不幸的是,它必須在編譯時,否則編譯器會嘗試編譯那個時間,看看它是否丟失。當然,我可以用相同的結構/簽名來定義我自己的類型,但這對我來說似乎非常黑客。 – Noldorin 2009-06-04 22:55:10

1

這聽起來像你想的編譯器忽略代碼的一個分支,它真的只通過隱藏它的#if塊的背後是可行的。將定義一個編譯器常量並使用#if爲您的目的工作?

#if MyConstant 
.... code here that uses the type .... 
#else 
.... workaround code .... 
#endif 

另一種選擇是在編譯時根本不依賴其他類,並使用反射或.NET 4.0動態關鍵字來使用它。如果它將在.NET 3.5或更早版本的perf-critical場景中重複調用,那麼可以使用DynamicMethod在首次使用時構建代碼,而不是每次都使用反射。

+0

這可能更接近我所需要的。我當時正在考慮使用#if指令以及預編譯腳本,該腳本定義了一個常量,當且僅當某個引用可以被解析。 – Noldorin 2009-06-04 23:12:14