TheGooch
asked on
Importing a C-style .dll AND marshalling confusing data types.
I am using the .NET Interop services to import a .dll written in C. One of the functions in the .dll has some very confusing data types. I'm new to marshalling data types - anyone want to help?
//// The original C-style function declaration looks something like this:
__int32 FunctionName( void * A, const char * B, unsigned char * C, unsigned __int32 D, unsigned char ** E, unsinged __int32 * F, unsigned char ** G, unsigned __int32 * G);
//// My C# code will look something like this:
using System;
using System.Runtime.InteropServ ices;
namespace SomeNamespace
{
public class SomeClass
{
[ DllImport( "SomeLibrary.dll" )]
public static extern int FunctionName( ..... WHAT SHOULD I DO NEXT ????? )
}
}
//////////
So, my question is: what C# treatment do I give all those ugly C-style data types???
Thanks!!!
//// The original C-style function declaration looks something like this:
__int32 FunctionName( void * A, const char * B, unsigned char * C, unsigned __int32 D, unsigned char ** E, unsinged __int32 * F, unsigned char ** G, unsigned __int32 * G);
//// My C# code will look something like this:
using System;
using System.Runtime.InteropServ
namespace SomeNamespace
{
public class SomeClass
{
[ DllImport( "SomeLibrary.dll" )]
public static extern int FunctionName( ..... WHAT SHOULD I DO NEXT ????? )
}
}
//////////
So, my question is: what C# treatment do I give all those ugly C-style data types???
Thanks!!!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Rwad about Marshal class. You need its functions to prepare input parameters to this function and to read output parameters.
For example, if A parameter expects pointer to some data, allocate memory block in C# using Marshal.AllocHGlobal Method. It returns IntPtr. Fill this block using unsafe programming and pass IntPtr to FunctionName.
If B points to ansi string, use Marshal.StringToHGlobalAns
Double pointer (**) may be passed as IntPtr ref or out parameter.