将参数从C#传递到C ++ CLI DLL

时间:2016-12-12 14:59:55

标签: c# c++ clr

我对C ++并不擅长,所以如果这很容易,请原谅。我必须编写2个C ++ DLL才能调用我们必须使用的SDK中的函数。第一个是本机C ++ DLL,它导入SDK功能。第二个是CLI C ++ DLL,它调用第一个DLL。第二个DLL在C#项目中被引用,然后被调用以便从C#内部与SDK通信,因为我没有其他方式与C#(P / Invoke等)的C ++ SDK对话,没有任何作用。我的主要问题是如何将值从C#传递给C ++ DLL。当我调试时,我的值是空的。这里有一些小片段,总结了我的所作所为。

C ++ Native DLL.h

namespace N
{
  class __declspec(dllexport) C
  {
  public:
    int Write(char a[14], char* B);
  }
}

C ++ Native DLL.cpp

namespace N
{
  int N::C::Write(char a[14], char* B)
  {
    // Here I need to add a 1 in front and \0 at the end of variable a
    char t[16] = {0};
    t[0] = 0x31;
    strcpy(&t[1], a);
  }
}

C ++ CLI DLL.h

namespace N
{
  class C;
  namespace NN
  {
    public ref class CC
    {
    public:
      int Write(char a[14], char* B);
    }
  }
}

C ++ CLI DLL.cpp

N::NN::C::CC() : _impl(new N::NN::C())
{
}

int Write(char a[14], char* B)
{
  return _impl->Write(a, B);
}

我的一个大问题是如何将值从C#传递到CLI dll,以便它们可用。我无法更改C ++ DLL中的数据类型或定义。目前,这是我在C#中所拥有的,在引用CLI dll之后:

C#方法(部分):

N.NN.C.CC c = new N.NN.C.CC();
byte[] ba = Encoding.ASCII.GetBytes("11111111111111");
byte[] bB = Encoding.ASCII.GetBytes("BBBBBB");
unsafe
{
  sbyte* bpa;
  sbyte* bpB;
  fixed (byte* pa = ba)
  {
    bpa = (sbyte*)pa;
  }
  fixed (byte* pB = bB)
  {
    bpB = (sbyte*)pB;
  }
  int iResult = c.Write(bpa, bpB);
}

这一切都在VS 2012中完成。我的问题是让第一个参数a在第一个DLL中可用。请告诉我是否应该在任何地方提供更多详细信息或尝试更好地解释,但我希望这就足够了。

0 个答案:

没有答案