我对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中可用。请告诉我是否应该在任何地方提供更多详细信息或尝试更好地解释,但我希望这就足够了。