Python for .NET: Using same .NET assembly in multiple versions

前端 未结 2 1374
你的背包
你的背包 2021-01-14 12:06

My problem: I have an assembly in 2 versions and want to use them at the same time in my Python project.

The .NET libs are installed in GAC (MSIL), having the same p

相关标签:
2条回答
  • 2021-01-14 12:37

    Well I found a solution: Python for .NET also supports Reflection!

    Instead of

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

    You have to use

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

    With that assembly you can use all the Reflection stuff like in C#. In my example I have to use following code (same for version 2):

    from System import Type
    type1 = assembly1.GetType(...)
    constructor1 = type1.GetConstructor(Type.EmptyTypes)
    myClass1 = constructor1.Invoke([])
    
    0 讨论(0)
  • 2021-01-14 12:43

    I could not get it working using the accepted answer. Here is my solution.

    Instead of using PythonNet you must use the .NET framework directly:

    import System
    
    dll_ref = System.Reflection.Assembly.LoadFile(fullPath)
    print(dll_ref.FullName)
    print(dll_ref.Location)
    

    Check that the correct DLL is used.

    To use multiple DLLs with the same version just load it to another variable

    another_dll_ref = System.Reflection.Assembly.LoadFile(anotherFullPath)
    

    Now you can use objects from the specified dll.

    Instance of a public non-static class

    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
    

    Calling a method in a public static class

    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']) 
    

    Creating a instance of a struct

    some_struct_type = dll_ref.GetType('MyNamespace.SomeStruct')
    my_struct = System.Activator.CreateInstance(some_struct_type)
    my_struct.a = 3
    

    (taken from my question Python for .NET: How to explicitly create instances of C# classes using different versions of the same DLL?)

    0 讨论(0)
提交回复
热议问题