【发布时间】:2014-03-20 18:51:26
【问题描述】:
我正在生成 C# 代码并在运行时将其编译为 DLL,然后将 DLL 加载到程序中并调用其方法。
但是当我再次编译 DLL 并尝试加载它时,.NET 已经认为它已经加载了 DLL,因此不会重新加载 DLL。我可以说是这种情况,因为即使我更改了它们的代码,我调用的任何方法仍然以相同的方式运行。同样在重新启动我的程序时,方法开始按预期工作。
我知道此时通常的建议是使用第二个AppDomain 并将MarshalByRef 添加到我的所有课程中,但这种方法对我不起作用;在 DLL 中,我需要转换在使用远程处理时不起作用的传入数据,因为对象是 __TransparentProxy 并将其转换为我需要的返回 null。
因此,据我所知,我的另一个选择是欺骗 .NET,使其认为它正在将不同的 DLL/类型加载到程序中,因此它实际上会加载它。
到目前为止我已经尝试过:
- 每次我将代码编译到 DLL 中时,DLL 都会输出到与之前不同的文件夹中。
- 向我尝试加载的类型添加 GUID,以便该类型始终具有不同的名称
- 在 AssemblyInfo.cs 文件中更改 GUID
...但是仍然没有加载新的 DLL。即使更改输出文件夹,查看属性 `assembly.Location' 也会显示旧的 DLL 路径。那么是什么让它认为它是一样的呢?
我如何在运行时加载 DLL:
Assembly assembly = Assembly.LoadFrom(dllFilePath);
Type type = assembly.GetTypes().Single(t => t.BaseType.Name == "Parser");
var classInstance = Activator.CreateInstance(type);
return classInstance as Parser;
【问题讨论】:
-
你已经知道你需要做什么,AppDomain 是必不可少的。您确实必须解决“不适合我”的问题。
标签: c# .net dll runtime remoting