我的测试机器上有一个非常奇怪的错误。错误是:
System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.
我就是不明白为什么。SetShort
有在DummyItem
类,我什至重新编译了一个版本,并写入事件日志,只是为了确保这不是部署/版本控制问题。奇怪的是调用代码甚至没有调用SetShort
method.
NOTE- 如果这个答案对您没有帮助,请花点时间向下滚动浏览人们此后添加的其他答案。
简短回答
如果您将方法添加到一个程序集中的接口,然后添加到另一个程序集中的实现类,但您重建实现程序集而不引用新版本的接口程序集,则可能会发生这种情况。
在本例中,DummyItem 实现另一个程序集的接口。 SetShort 方法最近被添加到界面和 DummyItem 中 - 但包含 DummyItem 的程序集是参考界面程序集的先前版本而重建的。因此,SetShort 方法实际上在那里,但没有将其链接到接口中的等效方法的魔法。
长答案
如果您想尝试重现此情况,请尝试以下操作:
-
创建一个类库项目:InterfaceDef,仅添加一个类,然后构建:
public interface IInterface
{
string GetString(string key);
//short GetShort(string key);
}
-
创建第二个类库项目:实现(使用单独的解决方案),将 InterfaceDef.dll 复制到项目目录中并添加为文件引用,仅添加一个类,然后构建:
public class ImplementingClass : IInterface
{
#region IInterface Members
public string GetString(string key)
{
return "hello world";
}
//public short GetShort(string key)
//{
// return 1;
//}
#endregion
}
-
创建第三个控制台项目:ClientCode,将两个dll复制到项目目录中,添加文件引用,并将以下代码添加到Main方法中:
IInterface test = new ImplementingClass();
string s = test.GetString("dummykey");
Console.WriteLine(s);
Console.ReadKey();
运行代码一次,控制台显示“hello world”
取消注释两个 dll 项目中的代码并重建 - 将两个 dll 复制回 ClientCode 项目,重建并再次尝试运行。尝试实例化 ImplementingClass 时会发生 TypeLoadException。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)