I have a C program that needs some functionallity of a library that is written in C# .NET. After I googled up a way how I could do that didn't took long until I hit another problem.
It seems that calling a method/function from that library is not a problem as long as there are no compley types are returned by functions (note: by now this is just my guess but this is the behavior I observed so far).
I want to show you how the code looks like (note: this is not the actual code but it contains those parts which could be interesting):
// C Code calling C# function from dll
#if defined(_WIN32)
# include <Windows.h>
# define COBJMACROS
# define CINTERFACE // For C-Interface
# include <mscoree.h>
#endif
void callCSharpFunction ()
{
HRESULT status;
BOOL Started;
DWORD result;
Started = FALSE;
// preparation code ..
status = ICLRRuntimeHost_ExecuteInDefaultAppDomain(
Host,
L"C:\\path\\mydll.dll",
L"mynamespace.myclass",
L"myfunction",
L"paramAsString",
&result
);
// ...
}
The C# Code, note that all functions I am calling using ICLRRuntimeHost_ExecuteInDefaultAppDomain
must have the same signature int fncname(string param);
.
/// C#
/// @param parameter is ignored
public static int myfunction(string strParam)
{
try {
IComplexObject co = (IComplexObject)SingletonObject.getComplexObject();
} catch(Exception ex) {
Console.WriteLine(ex.Message);
return ERR_EXCEPTION;
}
if (co.IsConfigured == false)
co.Configure();
if (co.IsConfigured == false)
return ERR_COULD_NOT_CONFIG;
return OK;
}
If I call a simpler function e.g. one that has no calls itself to functions which return a complex object like IComplexObject
everything works fine. As soon as an internal call like (IComplexObject)SingletonObject.getComplexObject();
comes into place the program does not work correctly. An exception gets thrown saying "Requested type was not found."
If you need any further information about anything let me know and I will try to give it to you.
At the end I'll show you the console output I am receiving in case someone can use that information:
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0012d140..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0012d140..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x758f812f in agentsib.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x758f812f in agentsib.exe: 0xE0434F4D: 0xe0434f4d.
First-chance exception at 0x758f812f in agentsib.exe: 0xE0434F4D: 0xe0434f4d.
'agentsib.exe': Loaded 'C:\Windows\System32\sspicli.dll', Cannot find or open the PDB file
'agentsib.exe': Loaded 'C:\Windows\System32\dhcpcsvc.dll', Cannot find or open the PDB file
'agentsib.exe': Loaded 'C:\Windows\System32\dhcpcsvc6.dll', Cannot find or open the PDB file
The thread 'Win32 Thread' (0x550) has exited with code 2 (0x2).
The thread 'Win32 Thread' (0xf30) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x910) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x1dd8) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x1b64) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x1dfc) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0x128c) has exited with code -1073741510 (0xc000013a).
The thread 'Win32 Thread' (0xa0c) has exited with code -1073741510 (0xc000013a).
The program '[5068] agentsib.exe: Native' has exited with code -1073741510 (0xc000013a).
Thank you for any help!
My suggestion: instead of figuring out what is the problem, you can:
Write a mix C++/CLI DLL, it calls the C# code, and exported the functionality as DLL exported functions.
The C program calls the exported functions in the mixed DLL.
As how to do this, please check This.
Try to host the CLR in C program, it is possible, but complex, and hard to debug. Also, you need handle the data conversion from native to managed world, and vice verse.
Another way is: wrap the C# DLL as COM, then C DLL will use the C# DLL via COM. You don't need to create an additional DLL, but there're other drawbacks: each exported C# type has to have a GUID; data conversion goes through COM type, for plain types, they're fine; for arrays, you need to use SAFEARRY. For details: please check this
User contributions licensed under CC BY-SA 3.0