我在我们的测试机上发现了一个非常奇怪的错误.错误是:

System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.

我就是不明白为什么.DummyItem类中有SetShort个,我甚至重新编译了一个版本,并写入了事件日志(log),以确保它不是部署/版本控制问题.奇怪的是,调用代码甚至没有调用SetShort方法.

推荐答案

NOTE-如果这个答案对你没有帮助,请花点时间向下滚动浏览人们添加的其他答案.

Short answer

如果在一个程序集中向接口添加方法,然后在另一个程序集中向实现类添加方法,但在不引用接口程序集的新版本的情况下重新生成实现程序集,则可能会发生这种情况.

在本例中,DummyItem实现来自另一个程序集的接口.SetShort方法最近被添加到接口和DummyItem中,但包含DummyItem的程序集是参照接口程序集的早期版本重建的.因此,SetShort方法是有效的,但没有将其与接口中的等效方法联系起来的魔法酱.

Long answer

如果要try 重现此内容,请try 以下操作:

  1. 创建一个类库项目:InterfaceDef,只添加一个类,然后构建:

    public interface IInterface
    {
        string GetString(string key);
        //short GetShort(string key);
    }
    
  2. 创建第二类库项目:实现(使用单独的解决方案),复制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
    }
    
  3. 创建第三个控制台项目:ClientCode,将两个DLL复制到项目目录中,添加文件引用,并将以下代码添加到Main方法中:

     IInterface test = new ImplementingClass();
     string s = test.GetString("dummykey");
     Console.WriteLine(s);
     Console.ReadKey();
    
  4. 运行一次代码,控制台显示"hello world"

  5. 取消注释两个DLL项目中的代码并重新生成-将这两个DLL复制回ClientCode项目中,重新生成并try 再次运行.try 实例化ImplementingClass时发生TypeLoadException.

.net相关问答推荐

带有ASP.NET核心的Angular 项目模板.API试验

.NET 4.5 项目未在 Visual Studio 2022 中编译

问:在 Blazor WASM 应用程序中存储 api 密钥的最佳方式是什么?

为什么 .NET 中的 System.Version 定义为 Major.Minor.Build.Revision?

lock() 是否保证按请求的顺序获得?

生产代码中的 System.Diagnostics.Debug.WriteLine

具有透明背景且包含不透明控件的 WPF 窗口

无法加载文件或程序集WebGrease,版本=1.5.1.25624,Culture=neutral,PublicKeyToken=31bf3856ad364e35或其依赖项之一

什么是 project.lock.json?

日期时间是什么意思?在 C# 中是什么意思?

静态析构函数

.NET 反射的成本是多少?

为什么 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

CryptographicException 未处理:系统找不到指定的文件

接口属性的 XML 序列化

并发字典正确用法

说明 C# 中 volatile 关键字的用法

obj 文件夹是为了什么而生成的?

可以从 C# 调用 C++ 代码吗?