Вызов C dll из C#, возвращаемые типы немного отличаются - PullRequest
0 голосов
/ 11 июля 2020

Я написал dll в C, в котором есть функции, которые я могу вызывать при обращении к DLL в C#. Если я использую тип basi c, например int, он работает нормально, но у меня есть структуры, которые немного отличаются в C# от C из-за языковых различий. Вот пример. Это определение функции в C#:

[DllImport("hello_world_cuda.dll", CharSet = CharSet.Auto)]
public static extern Batch Cut();

А вот оно в C:

extern "C" Batch __declspec(dllexport) __stdcall Cut()

Вы можете видеть, что тип возврата Batch такой же, но здесь это его определение в C#

class Envelope
{
    public byte[] Payload;
    public byte[] Signature;
}

class Batch
{
    public Envelope[] Messages;
    public int MsgCount;
}

А вот определение в C

struct Envelope
{
public:
    char* Payload;
    char* Signature;
};

struct Batch
{
public:
    Envelope* Messages;
    int MsgCount;
};

Как мне преодолеть эти языковые различия, чтобы успешно выполнить вызов DLL в C#?

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Вы должны также определить Envelope и Batch как структуры в C# и применить атрибут StructLaylout :

например:

[StructLayout(LayoutKind.Sequential, Pack=0)]
struct Envelope
{
   ...
}
1 голос
/ 11 июля 2020

Указатели на неуправляемом языке не отображаются на управляемые массивы, как вы это сделали, вот почему он жалуется. char - это (почти всегда, с очень ограниченными исключениями) 8-битное значение, которое, как вы заметили, хорошо соответствует byte в C#, но вам также необходимо сделать их указателями в управляемой структуре:

unsafe struct Envelope
{
    public byte* Payload;
    public byte* Signature;
}
...