3

我的问题:我有 2 个版本的程序集,并且想在我的 Python 项目中同时使用它们。

.NET 库安装在 GAC (MSIL) 中,具有相同的公共令牌:

lib.dll (1.0.0.0)
lib.dll (2.0.0.0)

在 Python 中,我想要这样的东西:

import clr
clr.AddReference("lib, Version=1.0.0.0, ...")
from lib import Class
myClass1 = Class()
myClass1.Operation()

*magic*

clr.AddReference("lib, Version=2.0.0.0, ...")
from lib import class
myClass2 = Class()
myClass2.Operation()
myClass2.OperationFromVersion2()

*other stuff*

# both objects should be accessibly
myClass1.Operation() 
myClass2.OperationFromVersion2()

有没有办法做到这一点?AppDomains 或 bindingRedirect 的东西?

注意:当然 myClass1.operationFromVersion2() 可能会失败......

4

2 回答 2

3

好吧,我找到了一个解决方案:Python for .NET 也支持反射!

代替

clr.AddReference("lib, Version=1.0.0.0, ...")

你必须使用

assembly1 = clr.AddReference("lib, Version=1.0.0.0, ...")

使用该程序集,您可以使用 C# 中的所有反射功能。在我的示例中,我必须使用以下代码(版本 2 相同):

from System import Type
type1 = assembly1.GetType(...)
constructor1 = type1.GetConstructor(Type.EmptyTypes)
myClass1 = constructor1.Invoke([])
于 2015-10-27T08:01:16.063 回答
1

我无法使用接受的答案让它工作。这是我的解决方案。

您必须直接使用 .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

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

于 2018-04-24T13:49:32.740 回答