【问题标题】:Create a class to implement interface (like a proxy class) at runtime创建一个类以在运行时实现接口(如代理类)
【发布时间】:2015-10-29 20:19:16
【问题描述】:

首先,我使用带有 .NET Framework 2.0 的 Visual Studio 2005。不幸的是,我不能使用最新版本的 VS/.NET。

我需要能够在运行时创建一个继承另一个类并实现某个接口的类。问题是需要继承的类具有相同的接口方法签名。

例如:

public interface ITestInterface
{
    void Test1();
    string Test2(int a, string b);
}

public class TestClass
{
    public void Test1() { ... }
    public string Test2(int a, string b) { ... }
    public void AnotherMethod() { ... }
}

如果我创建另一个类,例如:

public class AnotherClass : TestClass, ITestInterface
{
}

在 Visual Studio 2005 中,它可以毫无问题地编译,因为 TestClass 已经实现了接口的所有方法/函数。

如果我检查为此类生成的 MSIL 代码,我可以看到它创建了一个名为 AnotherClass 的类型,该类型继承自 TestClass 并按照我的预期实现 ITestInterface(没有实现方法/函数,因为它们已经在基类中实现)。

尝试在运行时通过这样的代码执行此操作:

object GetProxy(Type iface, Type obj)
{
    string name = obj.Name + "Proxy";
    AssemblyBuilder assyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(name), AssemblyBuilderAccess.Run);
    ModuleBuilder modBuilder = assyBuilder.DefineDynamicModule(name);
    TypeBuilder typeBuilder = modBuilder.DefineType(name, TypeAttributes.Public | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit, obj, new Type[] { iface });

    Type proxyType = typeBuilder.CreateType(); // Exception here

    return Activator.CreateInstance(proxyType);
}

抛出以下异常:

“System.TypeLoadException”类型的未处理异常发生在 mscorlib.dll

附加信息:“TestClassProxy”类型中的方法“Test1”来自 程序集'TestClassProxy,版本=0.0.0.0,文化=中性, PublicKeyToken=null' 没有实现。

如果接口的方法已经在基类中实现,我不明白为什么运行时会强迫我实现接口的方法。

你有什么想法吗?也许我缺少一个选项?

【问题讨论】:

标签: c# .net proxy runtime cil


【解决方案1】:

根据 Brian 建议的在 this linkthis one 中找到的信息,将基类方法/函数标记为 virtual 可以解决此特定问题。

我知道这对基类提出了要求,但在我的情况下这是可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2010-11-15
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多