Python for .NET:如何使用同一DLL的不同版本显式创建C#类的实例?

我有一个.cs文件

namespace SomeNamepace { public struct SomeStruct { .... } public static class SomeClass { .... } 

到目前为止,我使用它与PythonNET一样

 import clr clr.AddReference('c:\\Test\Module.dll') from SomeNamepace import SomeClass, SomeStruct SomeClass.SomeMethod(...) 

我现在的问题是我需要使用具有相同名称且没有设置版本号的dll,因此PythonNET不会将它们视为两个不同的dll,而是相同。 即使我使用AddReference的完整路径导入它们。

现在我想明确地使用它们,如下所述:

Python for .NET:在多个版本中使用相同的.NET程序集

喜欢

 lib = clr.AddReference('c:\\Test\Module.dll') 

我尝试了很多东西来创建SomeClass的实例

 lib.SomeNamespace.SomeClass() 

要么

 import System System.Activator.CreateInstance(lib.GetType('SomeNamespace.SomeClass')) 

或使用方法InitializeCreateInstance

或者如下面的链接中所述

 from System import Type type1 = lib.GetType('SomeNamespace.SomeClass') constructor1 = type1.GetConstructor(Type.EmptyTypes) 

最终一切都失败了,没找到的东西,没有方法等等。

这样做的正确语法是什么?

我找到了一个旧的邮件列表对话,可以解释它

如果您需要加载特定程序集的多个版本(或者更可能的是,您依赖某些库,那么事情会变得复杂得多)。

在这种情况下,您通过CLR模块访问的名称将始终来自加载的程序集的第一个版本(它将始终在运行时的内部中获胜)。

在那里发布的解决方案不再起作用了,我猜.NETfunction已经被删除了。 但是有一个解决方案。 您必须直接使用.NET框架,而不是使用PythonNet:

 import System dll_ref = System.Reflection.Assembly.LoadFile(fullPath) print(dll_ref.FullName) print(dll_ref.Location) 

检查是否使用了正确的DLL。

要使用具有相同版本的多个DLL,只需将其加载到另一个变量即可

 another_dll_ref = System.Reflection.Assembly.LoadFile(anotherFullPath) 

现在您可以使用指定dll中的对象。

公共非静态类的实例

 some_class_type = dll_ref.GetType('MyNamespace.SomeClass') my_instance = System.Activator.CreateInstance(some_class_type) my_instance.a = 4 # setting attribute my_instance.b('whatever') # calling methods 

在公共静态类中调用方法

 some_class_type = dll_ref.GetType('MyNamespace.SomeClass') method = some_class_type.GetMethod('SomeMethod') # return type and list of parameters method.Invoke(None, [1, 2.0, '3']) 

创建结构的实例

 some_struct_type = dll_ref.GetType('MyNamespace.SomeStruct') my_struct = System.Activator.CreateInstance(some_struct_type) my_struct.a = 3 

来自LoadFile上的文档

使用LoadFile方法加载和检查具有相同标识但位于不同路径的程序集.LoadFile不会将文件加载到load-from上下文中,也不会像LoadFrom方法那样使用加载路径解析依赖项。 LoadFile在此有限的场景中很有用,因为LoadFrom不能用于加载具有相同标识但路径不同的程序集; 它只会加载第一个这样的组件。

不起作用的方法:

  • 使用dll_ref = clr.AddReference(f)添加对具有不同版本的其他DLL的引用不起作用,即使明确指定了文件名并使用dll_ref和Reflection来获取方法

  • 使用长名称(如'MyNamespace, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null'与System.Reflection.Assembly.Load与版本仍将使用第一个版本

  • 如果已加载具有相同标识的程序集,则System.Reflection.Assembly.LoadFrom不能与同一DLL的多个版本一起使用。 即使指定了不同的路径,LoadFrom也会返回已加载的程序集。 ( Doc LoadFrom )