Перечисление C ++ в приложении .net дает сбой - PullRequest
0 голосов
/ 29 марта 2011

В моем приложении C # .Net я использую C ++ DLL с DllImport.
C ++ DLL содержит определение перечисления:

enum mode { A, B, C };

class myClass {
    char name[512];
    mode myMode; //variables beneath this line cause crash
    char pass[512];
};

Я определил то же enum в своем приложении C # .Net:

public enum mode { A, B, C };

Теперь, если я получаю доступ к переменной myclass, определенной после строки myMode, я получаю ошибку повреждения памяти:

getName();  //ok
getPass(); //error

extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; }

Оболочка C #:

[DllImport(DLLNAME)]
public static extern string GetPass();

В качестве обходного пути я использую int как тип для myMode, и все работает.Но мне любопытно, как это сделать правильно.

1 Ответ

2 голосов
/ 30 марта 2011

Вы писали:

// .cpp
extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; }

// .cs
[DllImport(DLLNAME)]
public static extern string GetPass();

Ew ... Это должно быть

[DllImport(DLLNAME)]
public static extern string getPass();

Я не знаю, чувствителен ли C # к регистру или нет, но AFAIK это так.

Еще один трюк, который я не могу понять, это LPCTSTR. Должно ли это быть LPCSTR из-за использования char[]? И, хм ... Действительно ли C # требует PASCAL соглашения?

...