P / Invoke код работает на WinXP, исключение на Win2k8 - PullRequest
1 голос
/ 30 июня 2010

Я пытаюсь получить доступ к функции в DLL на C # и C ++.

C ++ работает нормально, как и C # на WinXP.Однако я получаю следующую ошибку при попытке получить доступ к функции в системе Win2k8:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory
is corrupt.
   at Router.GetAddress()

Объявление в C #:

    [DllImport("Constants.dll")]
    static extern String GetAddress();

Использование в C # (на данный момент) просто выводит его:

Console.WriteLine(GetAddress());

и содержание функции DLL являются просто:

const static WCHAR* szAddress= L"net.tcp://localhost:4502/TestAddress";

extern "C" __declspec(dllexport) const WCHAR* GetAddress()
{
     return szAddress;
}

Я действительно не думаю, что было что-то спорным здесь.Единственное, о чем я могу думать, это возврат констант из GetAddress, но я не уверен, как применить соответствующее ключевое слово к C #, так как я еще не настолько знаком с этим языком.

Любые предложения будутс благодарностью.

1 Ответ

0 голосов
/ 01 июля 2010

Я решил эту проблему, используя подробности в http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4e387bb3-6b99-4b9d-91bb-9ec00c47e3a4.

Я изменил объявление на:

    [DllImport("Constants.dll", CharSet = CharSet.Unicode)]
    static extern int GetAddress(StringBuilder strAddress); 

Поэтому использование стало:

StringBuilder sb = new StringBuilder(1000000); // Arbitrary length for the time being
GetAddress(sb);
Console.WriteLine(sb.ToString());

И библиотека была изменена на:

const static WCHAR* szAddress = L"net.tcp://localhost:4502/TestAddress";

extern "C" __declspec(dllexport) int GetAddress(WCHAR* strAddress)
{
     wcscpy(strAddress, szAddress);
     return 0;
}
...