Как исправить ошибку «Подпись типа метода не совместима с PInvoke» в C # - PullRequest
0 голосов
/ 18 октября 2019

Все, что мне нужно знать, это как вернуть структуру из PInvoke в C ++, которая имеет следующую структуру. На данный момент я могу иметь дело с тем, что она пустая, и я просто хочу знать, как вернуть структуру при условиях, установленных в коде.

Я пробовал использовать всю структуру, которую мне нужно вернуть, иизолировал каждую часть структуры, чтобы узнать, какая часть вызывает у меня проблему (что станет ясно из представленного кода).

Я пробовал тот же метод, желая вернуть несколько целых чисел в структуре, котораяработает отлично. (Пытался сделать это жирным шрифтом, используя ***, ___)

//.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 голосов
/ 18 октября 2019

Поскольку тип 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 # и именем метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...