我所需要知道的是如何从具有以下结构的C ++中的PInvoke返回结构。目前,我可以将其保留为空白,而我只想知道如何在代码中设置的条件下返回该结构。
我尝试了返回的整个结构,并隔离了结构的每个部分,以了解哪个部分给了我这个问题(在提供的代码中将显而易见)。
我想通过在结构正常的情况下返回一些整数来尝试相同的方法。 (尝试使用***,___将此字体设置为粗体)
//.header file
typedef struct { //Defintion of my struct in C++
TCHAR msg[256];
}testTCHAR;
//.cpp file
extern "C" {
__declspec(dllexport) testTCHAR* (_stdcall TestChar(testTCHAR* AR))
{
AR->msg;
return AR;
}
}
在我的C#中,我将.dll称为:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void testChar(testTCHAR AR);
[DllImport("C:\\Users\\jch\\source\\repos\\FlatPanelSensor\\x64\\Debug\\VADAV_AcqS.dll", EntryPoint = "TestCallBackChar", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern testTCHAR TestCallBackChar([MarshalAs(UnmanagedType.FunctionPtr)] testChar call);
//Struct
public struct testTCHAR
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string rMsg; //I assume the error should be fixed here
but to what exactly I don't know.
}
//Defining the callback
testChar tChar =
(test) =>
{
//As far as I'm aware this part can be left blank
as I followed a tutorial online
};
testTCHAR returned = TestCallBackChar(tChar); //This is where the error
happens
我只需要返回该结构,最好返回一个附加值。
我得到的错误是“方法的类型签名与PInvoke不兼容”。标题中有哪一个,但我涵盖了所有基础。
如果您需要更多有关此的信息,请询问,我应该能够提供。
答案 0 :(得分:0)
由于testTCHAR
类型包含托管引用,因此您不能将指针用作签名的一部分(不是签名),但是按值传递它也没有意义(这就是为什么运行时会产生您看到的错误。
您需要更改签名,以便很明显地希望将指针传递给本机方法:
public delegate void testChar(IntPtr data);
public unsafe static extern IntPtr TestCallBackChar([MarshalAs(UnmanagedType.FunctionPtr)] testChar call);
调用时,您需要将结构显式编组为托管等效项(反之亦然):
testChar tChar =
(inputPtr) =>
{
testTCHAR input = (testTCHAR)Marshal.PtrToStructure(inputPtr, typeof(testTCHAR));
};
IntPtr returnedPtr = TestCallBackChar(tChar);
testTCHAR returned = (testTCHAR)Marshal.PtrToStructure(returnedPtr, typeof(testTCHAR));
此外,我想C ++和C#签名与方法名称之间不匹配。