首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用新创建的类型替换运行时的现有类定义

用新创建的类型替换运行时的现有类定义
EN

Stack Overflow用户
提问于 2019-07-09 01:01:07
回答 2查看 68关注 0票数 0

演示

https://github.com/gabbersepp/csharp-dynamic-replace-class

如何使用

  1. Checkout
  2. Compile
  3. Delete TestLib.dll & TestLib.pdb从console/bin/Debug
  4. Execute console.exe到cmd

读取第一个

我有一些我想在工作中实现的东西,我认为这将是最好的解决方案。所以请不要讨论我是否可以用另一种方法解决这个问题。如果我想讨论这个,我会创建一个新的SO帖子。

给定的

库中的类:

namespace Test.TestLib
{
    public class Class1
    {
    }
}

第二个类创建它的一个实例:

namespace console
{
    public class AnotherClass
    {
        public void Create()
        {
            new Class1();
        }
    }
}

和一个调用create的控制台应用程序

    static void Main(string[] args)
    {
        //...
        new AnotherClass().Create();
    }

请记住,额外的库中只有Class1。另外两个类在同一个类中。

I want to do

在运行时替换类型Class1

        AssemblyName dynamicAssemblyName = new AssemblyName("TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
        dynamicAssembly =
            AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.Run);
        var dynamicModule = dynamicAssembly.DefineDynamicModule("TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
        var modelType = dynamicModule.DefineType("Test.TestLib.Class1", TypeAttributes.Class).CreateType();

这是可行的。如果我使用的是激活器:Activator.CreateInstance(modelType);,我会得到一个这个类型的新实例。

而不是

当到达包含new Class1的行时,将抛出一个异常:

Unbehandelte Ausnahme: System.MethodAccessException: Fehler beim Methode "console.AnotherClass.Create()",auf Methode "Test.TestLib.Class1..ctor()“zuzugreen.bei console.AnotherClass.Create()

类似于

未处理的异常: System.MethodAccessException:尝试访问方法"console.AnotherClass.Create ()“方法"Test.TestLib.Class1..ctor ()”时出错。在console.AnotherClass.Create ()上的测试

问题

这个是可能的吗?

Sidenote:需要从/debug文件夹中删除TestLib文件,否则不会引发AsemblyResolve事件(有关完整示例,请参阅存储库

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-09 02:00:47

在DefineType中添加TypeAttributes.Public,执行成功

检查这个:https://github.com/aIjundi/csharp-dynamic-replace-class

票数 0
EN

Stack Overflow用户

发布于 2019-07-09 01:14:33

新创建的类型的构造函数不是公共的,因此是MethodAccessAcception

您可以在TypeBuilder实例上使用以下调用来创建公共默认构造函数:

var modelTypeBuilder = dynamicModule.DefineType("Test.TestLib.Class1", TypeAttributes.Class);
modelTypeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
var modelType = modelTypeBuilder.CreateType();

否则,您可以使用modelTypeBuilder.DefineConstructor()设置更多可能的选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56939542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档