Call a C++ function from C#

2019-01-25 23:18发布

I have 2 C++ DLLs. One of them contains the following function:

void init(const unsigned char* initData, const unsigned char* key)

The other one contains this function:

BYTE* encrypt(BYTE *inOut, UINT inputSize, BYTE *secretKey, UINT secretKeySize).

Is there a way to call these 2 functions from C#? I know you can use [DllImport] in C# to call C++ functions, but the pointers are giving me a hard time.

Any help would be appreciated!

标签: c# c++ dll
4条回答
放我归山
2楼-- · 2019-01-25 23:51

Yes, you can call both of these from C# assuming that they are wrapped in extern "C" sections. I can't give you a detailed PInvoke signature because I don't have enough information on how the various parameters are related but the following will work.

[DllImport("yourdllName.dll")]
public static extern void init(IntPtr initData, IntPtr key);

[DllImport("yourdllName.dll")]
public static extern IntPtr encrpyt(IntPtr inout, unsigned inuputSize, IntPtr key, unsigned secretKeySize);

Pieces of information that would allow us to create a better signature

  1. Is the return of encrypt allocated memory?
  2. If #1 is true, how is the memory allocated
  3. Can you give a basic description on how the parameters work?
  4. I'm guessing that all of the pointer values represents arrays / groups of elements instead of a single element correct?
查看更多
冷血范
3楼-- · 2019-01-25 23:51

For pointers, what you want to use is IntPtr.

[DllImport("whatever.dll")]
static extern void init(IntPtr initData, IntPtr key);
查看更多
再贱就再见
4楼-- · 2019-01-25 23:53

For classes, you don't need to do anything special. For value types, you need to use the ref keyword.

MSDN has an article that summarizes this: http://msdn.microsoft.com/en-us/library/awbckfbz.aspx

查看更多
做个烂人
5楼-- · 2019-01-26 00:01
[DllImport("yourdll.dll")]
static extern void init([MarshalAs(UnmanagedType.LPArray)] byte[] initData, [MarshalAs(UnmanagedType.LPArray)] byte[] key);

[DllImport("yourdll.dll")]
static extern IntPtr encrypt([MarshalAs(UnmanagedType.LPArray)] byte[] inOut, int inputSize, [MarshalAs(UnmanagedType.LPArray)] byte[] key, int secretKeySize);
查看更多
登录 后发表回答