6

我正在使用程序 Reflexil 将可执行文件 Foo1.exe 中的引用注入到名为 Foo2.dll 的外部程序集。

在 Foo1.exe 中,有一个名为 Bar 的类。

在 Foo2.dll 中,有一个接口 IBar,它正确地实现了 Bar 的所有字段和方法。

我使用 Reflexil 为 Foo1.exe 中的 Bar 提供了 Foo2.dll 中的 IBar 接口。

当 Foo1.exe 加载时,它会在应用程序目录中找到 Foo2.dll 并加载它,但它会抛出 System.TypeLoadException 并显示以下错误消息Method 'get_***' in type 'Foo1.Bar' from assembly 'Foo1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

我已经用相同的错误消息通读了上一个问题(TypeLoadException 说'没有实现',但它已实现),但是当我没有任何编译器时,我无法弄清楚如何正确实现修复检查 Foo1.exe。

谢谢你的帮助!

4

1 回答 1

5

在以下情况下,我收到了相同的错误消息:A.dll 依赖于 B.dll,B.dll 依赖于 C.dll 并且找不到 C.dll。在我的例子中,A.dll 包含一个派生自抽象类 C1 的类 C2,它位于同一个程序集和同一个 dll - A.dll 中。C1 派生自 B.dll 的 C0 类。C0 具有抽象 getter 方法的抽象属性,C1 具有该属性的实现,但问题是该属性的 getter 的返回类型是在缺少的库 C.dll 中定义的。最后,它会导致错误消息“方法 'get_Prop' in type 'C2' from assembly 'A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxx' does not have an implementation。” 这在这种情况下是无关紧要的。简而言之,源代码如下所示:

C.dll:

namespace C {
  public enum PropType {V1 = 0, V2 = 1, ...}
}

B.dll:

using C;
namespace B {
  public abstract class C0 {
    ...
    public abstract C.PropType Prop {get;}
  }
}

A.dll:

using C;
using B;
namespace A {
  public abstract class C1 : B.C0 {
    ...
    // Getter implementation
    public override C.PropType Prop { get {return C.PropType.V1;}}
  }
}

using C;
using B;
namespace A {
  // Class implementation
  public class C2 : C1 {
    ...
  }
}

所以解决方法是在安装中添加C.dll。

于 2012-06-05T11:23:53.027 回答