15

How can we export C# methods?

I have a dll and I want to use its methods in the Python language with the ctypes module. Because I need to use the ctypes module, I need to export the C# methods for them to be visible in Python.

So, how can I export the C# methods (like they do in C++)?

2
  • Contrary to popular belief, this is possible. See here. Commented Jan 17, 2010 at 19:01
  • python.net allows bi-directional interop between Python and .NET using Python C-API and .NET Pinvoke and Unmanaged Exports, mentioned below. So all the hard pieces are written for you! pythonnet.github.io Commented Sep 8, 2016 at 4:29

3 Answers 3

1

With the normal Python implementation ("CPython"), you can't, at least not directly.

You could write native C wrappers around our C# methods using C++/CLI, and call these wrappers from Python.

Or, you could try IronPython. This lets you run Python code and call code in any .Net language, including C#.

Sign up to request clarification or add additional context in comments.

1 Comment

I want to use Python itself and not an extra implementation of it like IronPython.
1

That's not possible. If you need DLL exports you'll need to use the C++/CLI language. For example:

public ref class Class1 { public: static int add(int a, int b) { return a + b; } }; extern "C" __declspec(dllexport) int add(int a, int b) { return Class1::add(a, b); } 

The class can be written in C# as well. The C++/CLI compiler emits a special thunk for the export that ensures that the CLR is loaded and execution switches to managed mode. This is not exactly fast.

Writing [ComVisible(true)] code in C# is another possibility.

7 Comments

Actually, it is possible. See my answer.
Meh, neither the article nor the downloadable source code explains how it works. I'll wait for confirmation from the OP.
I had to build a wrapper c++ dll (of the c# dll) to properly use the ctypes module!
And there we have it.
@HansPassant you seem to downplay Unmanaged Exports in all reverse pinvoke threads on SO. But does C++/CLI have a "downloadable source code"? When was the last time C++ features were added to C++/CLI? UE is licensed MIT and ILSPY is pretty good at providing C# code for it.
|
1

The "normal" way of exposing .NET/C# objects to unmanaged code (like Python) is to create a COM-callable wrapper for the C# DLL (.NET assembly), and call that using Python's COM/OLE support. To create the COM-callable wrapper, use the tlbexp and/or regasm command-line utilities.

Obviously, however, this does not provide a C/DLL-style API.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.