I want to call my .NET code from unmanaged C++. My process entrypoint is .NET based, so I don't have to worry about hosting the CLR. I know it can be done using COM wrappers for .NET objects, but I would like to access individual static methods of managed classes, so COM isn't my shortest/easiest route.
Assuming you are talking about real unmanaged code - not just native C++ running in a mixed-mode assembly compiled with /clr - the easiest way is to create a wrapper to your .NET code in C++/CLI. You can then export the C++/CLI methods by just marking them with __declspec(dllexport).
Alternatively, if you have control over the invocation of the unmanaged code, you can marshal function-pointers to your .NET methods and pass them to the unmanaged code.
Look at this solution: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports The solution allows to call C# function from C by decorating your function with [DllExport] attribute (opposite of P/Invoke DllImport).
Exmaple:
C# code
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
C code:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
Output:
The solution is found!!! Z is 15
Update: There is a question and a good answer in comments:
How do I include the dll in the unmanaged project?
You have to link to the .lib file that is generated upon compiling your C# code (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)
Assuming you are talking about real unmanaged code - not just native C++ running in a mixed-mode assembly compiled with /clr - the easiest way is to create a wrapper to your .NET code in C++/CLI. You can then export the C++/CLI methods by just marking them with __declspec(dllexport).
Alternatively, if you have control over the invocation of the unmanaged code, you can marshal function-pointers to your .NET methods and pass them to the unmanaged code.
I believe you are looking for Reverse PInvoke. If you google for reverse pinvoke you'll get a lot of helpful entries. I think the following has a good quick and dirty example.
Your calling code is C++ with /clr
enabled. Right?
If yes, then you can simply use the using statement to use your .NET dll in your code. Something like:
#using <Mydll.dll>
and then you can simply make the objects of your managed classes like:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
If you want to make this obj a data member of your class the using gcroot is the way to go.
Find nice way here Using C# from native C++ with the help of C++/CLI after integration to different solution found also these changes:
AdditionalIncludeDirectories ...YahooAPIWrapper
AdditionalDependencies ...YahooAPIWrapper.lib
And relations to both projects, was able to open C# form by thread in last DLL and send info from native C++, only ...APIWrapper.h include needed - should be done way better, but works ;-)
public YahooAPI()
{
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
ShowForm();
}).Start();
}
private static Form1 form = null;
public static void ShowForm()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
form = new Form1();
Application.Run(form);
}
public void SendValues(bool[] values)
{
if (form != null && form.ready) ...
}
ready is my bool member set when form initialization finished
© 2022 - 2024 — McMap. All rights reserved.