Joe*_*Joe 6 .net c# python python.net pythonnet
我有一个.cs文件
namespace SomeNamepace
{
public struct SomeStruct
{
....
}
public static class SomeClass
{
....
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我使用它与PythonNET一样
import clr
clr.AddReference('c:\\Test\Module.dll')
from SomeNamepace import SomeClass, SomeStruct
SomeClass.SomeMethod(...)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我需要使用具有相同名称且没有设置版本号的dll,因此PythonNET不会将它们视为两个不同的dll,而是相同.即使我使用AddReference的完整路径导入它们.
现在我想明确地使用它们,如下所述:
Python for .NET:在多个版本中使用相同的.NET程序集
喜欢
lib = clr.AddReference('c:\\Test\Module.dll')
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西来创建一个SomeClass
类似的实例
lib.SomeNamespace.SomeClass()
Run Code Online (Sandbox Code Playgroud)
要么
import System
System.Activator.CreateInstance(lib.GetType('SomeNamespace.SomeClass'))
Run Code Online (Sandbox Code Playgroud)
或使用方法Initialize
或CreateInstance
或者如下面的链接中所述
from System import Type
type1 = lib.GetType('SomeNamespace.SomeClass')
constructor1 = type1.GetConstructor(Type.EmptyTypes)
Run Code Online (Sandbox Code Playgroud)
最后一切都失败了,没找到的东西,没有方法等等.
这样做的正确语法是什么?
我找到了一个旧的邮件列表对话,可以解释它
如果您需要加载特定程序集的多个版本(或者更可能的是,您依赖某些库,那么事情会变得复杂得多).
在这种情况下,您通过CLR模块访问的名称将始终来自加载的程序集的第一个版本(它将始终在运行时的内部中获胜).
在那里发布的解决方案不再有效,我想.NET功能已经被删除了.但是有一个解决方案.您必须直接使用.NET框架,而不是使用PythonNet:
import System
dll_ref = System.Reflection.Assembly.LoadFile(fullPath)
print(dll_ref.FullName)
print(dll_ref.Location)
Run Code Online (Sandbox Code Playgroud)
检查是否使用了正确的DLL.
要使用具有相同版本的多个DLL,只需将其加载到另一个变量即可
another_dll_ref = System.Reflection.Assembly.LoadFile(anotherFullPath)
Run Code Online (Sandbox Code Playgroud)
现在您可以使用指定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
Run Code Online (Sandbox Code Playgroud)
在公共静态类中调用方法
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'])
Run Code Online (Sandbox Code Playgroud)
创建结构的实例
some_struct_type = dll_ref.GetType('MyNamespace.SomeStruct')
my_struct = System.Activator.CreateInstance(some_struct_type)
my_struct.a = 3
Run Code Online (Sandbox Code Playgroud)
来自LoadFile上的文档
使用LoadFile方法加载和检查具有相同标识但位于不同路径的程序集.LoadFile不会将文件加载到load-from上下文中,也不会像LoadFrom方法那样使用加载路径解析依赖项. LoadFile在这种有限的场景中很有用,因为LoadFrom不能用于加载具有相同标识但路径不同的程序集; 它只会加载第一个这样的组件.
不起作用的方法:
使用不同版本添加对其他DLL的引用dll_ref = clr.AddReference(f)
不起作用,即使明确指定了文件名dll_ref
并且使用了Reflection来获取方法
使用长名称('MyNamespace, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null'
与System.Reflection.Assembly.Load 一样,版本仍将使用第一个版本
System.Reflection.Assembly.LoadFrom
如果已加载具有相同标识的程序集,则不能使用同一DLL的多个版本.即使指定了不同的路径,LoadFrom也会返回已加载的程序集.(Doc LoadFrom)
归档时间: |
|
查看次数: |
1509 次 |
最近记录: |