C#在运行时加载DLL,第二次加载不起作用

时间:2014-03-20 18:51:26

标签: c# .net dll runtime remoting

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

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

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

所以我能看到的另一个选择是欺骗.NET认为它正在将不同的DLL /类型加载到程序中,所以实际加载它。

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

  1. 每次将代码编译到DLL中时,DLL都会输出到之前的其他文件夹中。
  2. 将GUID添加到我尝试加载的类型中,以便类型始终具有不同的名称
  3. 更改AssemblyInfo.cs文件中的GUID
  4. ...但仍然没有加载新的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; 
    

1 个答案:

答案 0 :(得分:0)

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