用c#代码构建问题 - CS0012 - IsLongModifier

时间:2016-07-14 20:23:16

标签: c#

我有一段非常简单的代码,在编译时给出了以下错误

  

错误CS0012类型' IsLongModifier'在一个程序集中定义   没有引用。您必须添加对程序集的引用   ' Microsoft.VisualC,Version = 10.0.0.0,Culture = neutral,   公钥= b03f5f7f11d50a3a'

以下是代码的相关部分

grid.get_NumericalCell(rowIndex, "Bench2");

我在get_NumericalCell函数调用上得到了一个红色的波浪。

该方法可从第三方库获得,该库以C ++ / C#实现。以下是方法的签名

double get_NumericalCell(int rowIndex, string columnName);

如果我添加对Microsoft.VisualC的引用,则错误消失。

IsLongModifier class上的参考文档对解释我遇到此问题的原因没什么帮助。

有人可以解释为什么我需要对Microsoft.VisualC.IsLongModifier的引用 - 我不会在我的代码中看到我在哪里引用它。

2 个答案:

答案 0 :(得分: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()方法查看反射。

答案 1 :(得分:2)

如果您使用反编译器(ILDasm,ILSpy,.NET Reflector,dotPeek等)检查第三方程序集,您将看到正在调用的方法的参数在IL级别进行修饰编译器抱怨的类型的修饰符(modopt)(您也可以编写代码来自己检查它们:modopt and .NET reflection)。编译器在编译时需要引用来推断要发出的代码,就像它有时会抱怨缺少对你直接使用的类型的基类型的程序集的引用一样,即使你编译的程序集没有最终引用“额外”程序集本身。