我在我们的测试机器上有一个非常奇怪的错误。错误是:
System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.
我只是不明白为什么。SetShort在DummyItem课堂上,我什至重新编译了一个写入事件日志的版本,以确保它不是部署/版本控制问题。奇怪的是调用代码甚至没有调用SetShort方法。
SetShort
DummyItem
注意 - 如果此答案对您没有帮助,请花时间向下滚动查看人们此后添加的其他答案。
简短的回答
如果您将方法添加到一个程序集中的接口,然后添加到另一个程序集中的实现类,但您重新构建实现程序集而不引用接口程序集的新版本,则可能会发生这种情况。
在这种情况下,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。