Python Forum

Full Version: HOW TO USE C# GENERATED DLL
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi,
I developed a C# CLI application with my own functionality , and I have created a .dll with several class to implements the comunications beetween my PC and a extrenal board.

I need to import .dll (C# created), in python because my friend is developing a Qt_py GUI. That GUI will use the class and method present on my .dll.
How can I do?

I saw somenthing, for instance ctypes... If somebody has another idea, It would be good.
(Jun-09-2023, 12:52 PM)davide_vergnani Wrote: [ -> ]I saw somenthing, for instance ctypes... If somebody has another idea, It would be good.
Yes ctypes or can eg use CFFI, pythonnet.
To show a couple examples found as i have not tried this myself.
import cffi

# Define the C# interface definition
csharp_code = '''
    [DllImport("YourDotNetDLL.dll")]
    public static extern int AddNumbers(int a, int b);
'''

# Create the FFI object
ffi = cffi.FFI()

# Set up the C# code and compile it
ffi.cdef(csharp_code)
lib = ffi.verify('''
    #include <windows.h>
    #include <YourDotNetDLL.h>
''', libraries=["YourDotNetDLL"])

# Call the C# function from the DLL
result = lib.AddNumbers(5, 3)
print("Result:", result)
# pip install pythonnet
import clr
clr.AddReference('path_to_your_dll')

# import the namespace and class

from Namespace import Class

# create an object of the class

obj = Class()

# access functions return type using object

value = obj.Function(<arguments>)
 
Thanks,
I tried to use clr. It does work, but I have a problem when I try to throw a function, the system cannot find to try a type System.ComponentModel.Componet.

>>> res = box.SetSerial('COM5', 10, pcprot.CCB2);
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
System.TypeLoadException: Could not load type 'System.ComponentModel.Component' from assembly 'System.ComponentModel.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
at WiredBoxLib.SerialPortAdapter.get_PortName()
at WiredBoxLib.WiredBox.SetSerial(String port, Int32 txinterval, PC_PROTOCOL protocol)


Above I reported what my python shell reports