5

Is there a way to call c# dll from c++ unmanaged application without COM usage?

Victor Ronin
  • 22,758
  • 18
  • 92
  • 184

4 Answers4

5

You can do this using Reverse P/Invoke - example and discussion here.

Steve Townsend
  • 53,498
  • 9
  • 91
  • 140
2

It is actually possible to disassemble, modify the IL, and reassemble it with exported functions. I messed with this a few years ago, and created an application that would disassemble a dll, provide a list of functions that could potentially be exported - allowing the user to select them, then re-write the IL and reassemble everything. Then, I could call directly into the dll from unmanaged code...or p-invoke into the dll from managed code (not really practical, but interesting nonetheless).

Surely there is a reason that this isn't supported in the .net languages themselves (even tho it is supported in MSIL). I wouldn't use this in production:

Dead link: http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

Wayback Machine: https://web.archive.org/web/20140213030149/http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

Eric Dahlvang
  • 8,252
  • 4
  • 29
  • 50
  • 1
    It is supported in C++/CLI, it automatically creates a thunk that will load the CLR when you __declspec(dllexport) a static C++/CLI function. Which is the Big Trick of course, can't run managed code without loading the CLR. – Hans Passant Dec 16 '10 at 22:29
  • @Hans When you add exports to your IL, ILASM will do everything that is required for your assembly to be used as if it were a native one. – Robert Giesecke Jan 05 '11 at 15:02
1

I might be a bit late, but check this out.

Using this little msbuild task, you can create a C# library that can be called as if it were a native DLL. (e.g. write plugins for apps that require them to be native dlls)

Oh and don't forget to use the project template, which will setup everything for you.

Robert Giesecke
  • 4,314
  • 21
  • 22
0

Your only option really is to either use C++.net or create a C++.net wrapper for it that exports what you need.

Calling C# code from C++

Community
  • 1
  • 1
Will
  • 10,013
  • 9
  • 45
  • 77