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

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

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

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

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

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

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

import Systemdll_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 attributemy_instance.b('whatever') # calling methods

在公共静态类中调用方法

some_class_type = dll_ref.GetType('MyNamespace.SomeClass')method = some_class_type.GetMethod('SomeMethod')# return type and list of parametersmethod.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)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5646127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存