演示
https://github.com/gabbersepp/csharp-dynamic-replace-class
如何使用
读取第一个
我有一些我想在工作中实现的东西,我认为这将是最好的解决方案。所以请不要讨论我是否可以用另一种方法解决这个问题。如果我想讨论这个,我会创建一个新的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
事件(有关完整示例,请参阅存储库
发布于 2019-07-09 02:00:47
在DefineType中添加TypeAttributes.Public
,执行成功
检查这个:https://github.com/aIjundi/csharp-dynamic-replace-class
发布于 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()
设置更多可能的选项。
https://stackoverflow.com/questions/56939542
复制相似问题