【问题标题】:Call C++ function in C# from DLL - strange parameters从 DLL 调用 C# 中的 C++ 函数 - 奇怪的参数
【发布时间】:2012-09-19 02:00:18
【问题描述】:

我有一个用 C++ 编写的函数,带有下一个标题:

void EncodeFromBufferIN(void* bufferIN,int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);

我已经像这样编辑了 .h 和 .cpp 文件,以便能够通过在 C# 中导入 DLL 来调用该函数:

**EncodeFromBufferIN.h**
extern "C" {
     __declspec(dllexport) void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);
}
**EncodeFromBufferIN.cpp**
extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize){
    // stuff to be done
}

但现在我的问题是我不知道如何在 C# 中调用该函数。我在 C# 中添加了下一个代码,但不确定如何将参数传递给函数。

[DllImport("QASEncoder.dll")]
        unsafe public static extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, out char[] bufferOUT, out int bufferOUTSize);

bufferIN 和 bufferOUT 应该是字符串,但如果我这样调用函数:

public string prepareJointsForQAS()
{
   string bufferIN = "0 0 0 0 0";
   char[] bufferOUT;
   int bufferOUTSize;
   EncodeFromBufferIN(bufferIN, bufferIN.Length, bufferOUT, bufferOUTSize);
}

我收到此错误:“...的最佳重载方法匹配有一些无效参数”。那么参数应该如何传递呢?

【问题讨论】:

  • 我不知道你的电话会如何工作。什么为输出缓冲区分配内存?什么可以释放它?
  • 我看到了 unsigned char* &bufferOUT。您是否更改了 cpp 代码中的 char 指针?此外,您对该功能的 pinvoke 方法无效。您必须使用某种“out string bufferIn”,但请在 MSDN 文档中为您的案例检查 marshaling 属性。
  • @David 这就是问题所在,我不知道如何调用函数以及参数在 C# 中应该如何匹配 C++ 中的参数
  • @MaxFX 不,指针没有改变

标签: c# c++ dll com


【解决方案1】:

编组最适合 C 风格的调用。所以最好使用 在您的公共界面上使用纯 C。 如果将本机代码更改为

void EncodeFromBufferIN(
    unsigned char* bufferIN, 
    int bufferINSize, 
    unsigned char* bufferOUT,     
    int* bufferOUTSize);

那么C#中的调用就可以这样了

[DllImport("QASEncoder.dll")]
public static extern void EncodeFromBufferIN(
    String bufferIN, 
    int bufferINSize, 
    StringBuilder bufferOUT, 
    ref int bufferOUTSize);

String inStr = new String(255);
int inSize = 255;
// make an educated estimate for the output size 
// and preallocate in C# (I am guessing 255)
StringBuilder outStr = new StringBuilder(255);
int outSize = 255;

EncodeFromBufferIN(inStr, inSize, outStr, outSize);

这样可以避免非托管代码中的内存分配 这(尽管可行)可能会变得混乱。

希望这能让你继续前进。

【讨论】:

    【解决方案2】:

    一些对我有用的更正:

            string inStr = "Value to pass";
            int inSize = inStr.Length;
            StringBuilder outStr = new StringBuilder(255);
            int outSize = 255;
    
            EncodeFromBufferIN(inStr, inSize, outStr, ref outSize);
    

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2010-10-07
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多