我发现一个古老的邮件列表对话可能会解释它
如果您需要加载一个特定程序集的多个版本(或者更可能的是,您依赖某个库的话),事情就会变得更加复杂。
在这种情况下,您通过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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)