演示
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
事件(有关完整示例,请参阅存储库
https://stackoverflow.com/questions/56939542
复制相似问题