我的测试机上有一个非常奇怪的错误。错误是:
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。