2016-07-14 83 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