【问题标题】:Call a C++ function from C#从 C# 调用 C++ 函数
【发布时间】:2009-06-13 19:54:58
【问题描述】:

我有 2 个 C++ DLL。其中之一包含以下功能:

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

另一个包含这个功能:

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

有没有办法从 C# 调用这两个函数?我知道你可以在 C# 中使用 [DllImport] 来调用 C++ 函数,但是指针让我很难受。

任何帮助将不胜感激!

【问题讨论】:

    标签: c# c++ dll


    【解决方案1】:

    是的,您可以从 C# 调用这两个,假设它们被包装在 extern "C" 部分中。我无法为您提供详细的 PInvoke 签名,因为我没有足够的信息来说明各种参数之间的关系,但以下内容将起作用。

    [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);
    

    有助于我们创建更好签名的信息

    1. 是否返回加密分配的内存?
    2. 如果#1为真,内存是如何分配的
    3. 您能否对参数的工作原理进行基本描述?
    4. 我猜所有的指针值都代表数组/元素组而不是单个元素,对吗?

    【讨论】:

    • 是的,encrypt的返回是分配内存。通常,返回数据的大小是已知的(8 个字节)。重要的参数是 inOut 和 secretKey。基本上,您只需使用从 0 到 inputSize 或 secretKeySize 指示的大小的 for 来读取数组中的所有数据。
    【解决方案2】:
    [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);
    

    【讨论】:

      【解决方案3】:

      对于课程,您不需要做任何特别的事情。对于值类型,您需要使用 ref 关键字。

      MSDN 有一篇文章总结了这一点: http://msdn.microsoft.com/en-us/library/awbckfbz.aspx

      【讨论】:

      • 在这里无法正常工作,因为数据几乎可以肯定代表数组而不是单个值
      • 你说得对,它们是数组。例如,第二个函数 inOut 中的第一个参数通常是 8 个字节长。
      • 实际上,您可以将数组传递给 ref 参数:“ref a[0]” - 这将固定数组并将第一项的地址提供给 C 函数。
      【解决方案4】:

      对于指针,你要使用的是IntPtr

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 2021-11-09
        相关资源
        最近更新 更多