Невозможно загрузить C ++ DLL в C # - PullRequest
2 голосов
/ 09 апреля 2009

> Моя предыдущая тема <</a>

Я создал это, потому что я установил WinXP на VMBox и не могу заставить его работать снова.

На этот раз я создал событие OnLoad в своей форме

        if (LoadLibrary("blowfish.dll") == 0)
        {
            Misc.LogToFile("Could not load dll", true);
            Application.Exit();
        }

Отлично работает на моем ПК, но на VMBox LoadLibrary возвращает 0.

Некоторые пользователи упоминали, что проблема заключалась в смешивании старой NET Framework (2.0) с библиотеками, созданными в новейшей MS Visual Studio (2008 SP1), поэтому я принял меры, и теперь свойства программы настроены для работы с NET 3.5

На VMBox у меня NET 2.0, но это не проблема - сама программа работает нормально. У меня также есть C ++ Redistributable (2005, 2005, SP1 и 2008).

В чем может быть проблема?

Ответы [ 4 ]

3 голосов
/ 09 апреля 2009

Для дальнейших неприятностей вы могли бы позвонить

Marshal.GetLastWin32Error();

, который должен дать вам код ошибки.

Возможно ли, что вы развернули отладочную версию своей родной библиотеки DLL, для которой также требуется отладочная версия MSVCR90 D .DLL? Вы должны были распространить версию выпуска, потому что отладочная версия требует наличия другого набора библиотек в целевой системе.

Очевидно, что он работает на компьютере разработчика, поскольку все отладочные версии необходимых библиотек поставляются с Visual Studio.

Так вы получите сообщение, содержащее код ошибки:

[DllImport("kernel32.dll")]
private static extern int FormatMessage(int dwFlags,
    IntPtr lpSource, int dwMessageId, int dwLanguageId,
    out string lpBuffer, int nSize, IntPtr pArguments);

public static string GetErrorMessage(int errorCode)
{
    const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
    const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
    const int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;

    string lpMsgBuf;
    int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER
        | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

    int retVal = FormatMessage(dwFlags, IntPtr.Zero, errorCode, 0,
                                out lpMsgBuf, 0, IntPtr.Zero);
    if (0 == retVal)
    {
        return null;
    }
    return lpMsgBuf;
}
1 голос
/ 09 апреля 2009

Вызовите GetLastError после LoadLibrary, проверьте значение кода ошибки здесь: http://msdn.microsoft.com/en-us/library/ms681381.aspx и посмотрим, поможет ли это.

0 голосов
/ 09 апреля 2009

Попробуйте запустить средство обхода зависимостей в DLL - посмотрите, отсутствуют ли какие-либо модули.

0 голосов
/ 09 апреля 2009

Возможно, что местоположение DLL находится на пути в одной среде, а не в другой. Это также может быть разрешения в одной среде не совпадают с другой.

...