取消

反射加载程序集提示方法未实现TypeLoadException

三层架构,ui引用的接口层项目,数据访问dal继承的接口项目,程序启动通过反射加载dal项目,加载过程中出现提示方法未实现。


问题

三层架构,ui引用的接口层项目,数据访问dal继承的接口项目,程序启动通过反射加载dal项目,加载过程中出现提示方法未实现。反编译接口项目和dal项目发现提示的方法是存在的。

解决

重新编译程序解决,先编译接口项目。

原因

dal项目没有直接引用接口项目,而是引用的编译后的程序集,可能在编译dal项目时,接口项目还没有重新编译,引用的还是以前的程序集。接口没有更新。即使后面编译了接口项目更新了接口,引用也没有更新。

在网上找到了如下的答案

如果将方法添加到一个程序集中的接口,然后添加到另一个程序集中的实现类,但是重新构建实现程序集而不引用新版本的接口程序集,则会发生这种情况. 在这种情况下,DummyItem实现来自另一个程序集的接口.SetShort方法最近被添加到接口和DummyItem中 - 但是包含DummyItem的程序集被重建,引用了先前版本的接口程序集.所以SetShort方法实际上就存在了,但没有魔术酱将它与界面中的等效方法联系起来.

示例

如果您想尝试重现此功能,请尝试以下操作:

  1. 创建一个类库项目:InterfaceDef,只添加一个类,然后构建:
1
2
3
4
5
6
public interface IInterface
{
    string GetString(string key);
    //short GetShort(string key);
}
  1. 创建第二个类库项目:实现(使用单独的解决方案),将InterfaceDef.dll复制到项目目录并添加为文件引用,只添加一个类,并构建:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ImplementingClass : IInterface
{
    #region IInterface Members
    public string GetString(string key)
    {
        return "hello world";
    }

    //public short GetShort(string key)
    //{
    //    return 1;
    //}
    #endregion
}
  1. 创建第三个控制台项目:ClientCode,将两个dll复制到项目目录中,添加文件引用,并将以下代码添加到Main方法中:
1
2
3
4
 IInterface test = new ImplementingClass();
 string s = test.GetString("dummykey");
 Console.WriteLine(s);
 Console.ReadKey();

运行一次代码,控制台说”你好世界”

取消注释两个dll项目中的代码并重建 - 将两个dll复制回ClientCode项目,重建并再次尝试运行.尝试实例化ImplementingClass时发生TypeLoadException.


参考资料

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/%E5%8F%8D%E5%B0%84%E5%8A%A0%E8%BD%BD%E7%A8%8B%E5%BA%8F%E9%9B%86%E6%8F%90%E7%A4%BA%E6%96%B9%E6%B3%95%E6%9C%AA%E5%AE%9E%E7%8E%B0 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论