2016-07-14 80 views
2

我有一個非常簡單的代碼,其在編譯給了我下面的錯誤構建問題IsLongModifier

錯誤CS0012類型「IsLongModifier」是在裝配定義 不引用。您必須添加對程序集 'Microsoft.VisualC,Version = 10.0.0.0,Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a'的引用。

下面是代碼

grid.get_NumericalCell(rowIndex, "Bench2"); 

我得到一個紅色波浪在get_NumericalCell函數調用的相關部分。

該方法可以從C++/C#中實現的第三方庫中獲得。下面是該方法的簽名

double get_NumericalCell(int rowIndex, string columnName); 

如果我添加對Microsoft.VisualC的引用,則錯誤消失。

關於IsLongModifier class的參考文檔對解釋我爲什麼面臨此問題沒有多大幫助。

有人可以解釋爲什麼我需要對Microsoft.VisualC.IsLongModifier的引用 - 我沒有看到我的代碼中引用它的位置。

回答

3

很有可能第三方庫參考了Microsoft.VisualC

get_NumericalCell()簽名可能不得不在C++中,看起來像這樣的控制裝置:

__gc class Grid 
{ 
    double get_NumericalCell(int i, string columnName) {} 
    double get_NumericalCell(long l, string columnName) {} 
}; 

將被編譯成IL看起來像這樣:

[...] float64 get_NumericalCell(int32 i, ...) [...] 
[...] float64 get_NumericalCell(int32 modopt([Microsoft.VisualC]Microsoft.VisualC.IsLongModifier) l, ...) [...] 

可選的改性劑,IsLongModifier被添加來區分這兩個簽名,否則它們是相同的。這隱藏了C#中的方法,但編譯器可能仍然需要對Microsoft.VisualC的引用。您可以通過GetOptionalCustomModifiers()方法檢查反射。

+0

我不遵循的是爲什麼如果第三方庫引用另一個庫,會導致編譯時失敗 – Vikhram

+0

對'get_NumericalCell()的調用可能會以某種方式引用對「IsLongModifier」類型的引用)' –

+0

你可以添加一些例子來說明如何發生,所以我更好的瞭解 – Vikhram

2

如果您使用反編譯器(ILDasm,ILSpy,.NET Reflector,dotPeek等)檢查第三方程序集,您將看到您調用的方法的參數已在IL級別修飾,與編譯器抱怨類型的修飾符(modopt)(您也可以編寫代碼自行檢查它們:modopt and .NET reflection)。編譯器需要引用來編譯發出的代碼,就像它有時會抱怨缺少對直接使用的基本類型的程序集引用一樣,即使編譯後的程序集沒有最終引用「額外」程序集本身。

+0

'grid'變量是一個接口的引用,並且接口方法沒有被修飾。我試圖找出它的執行情況,似乎也沒有裝飾 – Vikhram

+0

哦。如果你想深究這一點,你可以反編譯整個第三方程序集,並搜索它發生的違規類型。 – cynic

+0

它是C#/ C++,所以我不能反編譯所有的作品 – Vikhram