您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

我发现一个古老的邮件列表对话可能会解释它

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

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

那里发布的解决方案不再起作用,我猜想.NET功能已被弃用。但是有解决方案。代替使用PythonNet,必须直接使用.NET框架:

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不会将文件加载到加载源上下文中,也不会像LoadFrom方法那样使用加载路径解析依赖项。在这种有限的情况下,LoadFile很有用,因为不能使用LoadFrom加载具有相同标识但路径不同的程序集。它只会加载第一个这样的程序集。

dll_ref = clr.AddReference(f)即使使用显式指定了文件dll_ref并且使用Reflection来获取方法,也无法添加对使用不同版本的其他DLL的引用。

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

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

python 2022/1/1 18:48:34 有378人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶