【问题标题】:C# Load in a DLL at runtime, second load does not workC# 在运行时加载 DLL,第二次加载不起作用
【发布时间】:2014-03-20 18:51:26
【问题描述】:

我正在生成 C# 代码并在运行时将其编译为 DLL,然后将 DLL 加载到程序中并调用其方法。

但是当我再次编译 DLL 并尝试加载它时,.NET 已经认为它已经加载了 DLL,因此不会重新加载 DLL。我可以说是这种情况,因为即使我更改了它们的代码,我调用的任何方法仍然以相同的方式运行。同样在重新启动我的程序时,方法开始按预期工作。

我知道此时通常的建议是使用第二个AppDomain 并将MarshalByRef 添加到我的所有课程中,但这种方法对我不起作用;在 DLL 中,我需要转换在使用远程处理时不起作用的传入数据,因为对象是 __TransparentProxy 并将其转换为我需要的返回 null。

因此,据我所知,我的另一个选择是欺骗 .NET,使其认为它正在将不同的 DLL/类型加载到程序中,因此它实际上会加载它。

到目前为止我已经尝试过:

  1. 每次我将代码编译到 DLL 中时,DLL 都会输出到与之前不同的文件夹中。
  2. 向我尝试加载的类型添加 GUID,以便该类型始终具有不同的名称
  3. 在 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


【解决方案1】:

Assembly.LoadFrom 方法将加载具有不同标识的新程序集。为新生成的 程序集 指定一个唯一的名称(不仅仅是文件名)。 http://msdn.microsoft.com/library/1009fa28(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2013-11-25
    相关资源
    最近更新 更多