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


问题内容

我的问题:我有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()可能会失败…


问题答案:

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

代替

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

你必须用

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

通过该程序集,您可以像在C#中一样使用所有Reflection东西。在我的示例中,我必须使用以下代码(与版本2相同):

from System import Type
type1 = assembly1.GetType(...)
constructor1 = type1.GetConstructor(Type.EmptyTypes)
myClass1 = constructor1.Invoke([])