如何在C#

时间:2019-10-18 11:09:14

标签: c# c++ struct

我所需要知道的是如何从具有以下结构的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不兼容”。标题中有哪一个,但我涵盖了所有基础。

如果您需要更多有关此的信息,请询问,我应该能够提供。

1 个答案:

答案 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#签名与方法名称之间不匹配。