无法在C#中加载C ++ DLL

时间:2009-04-09 18:18:43

标签: c# c++ .net-3.5 dll crash

>My previous thread<

我创建了这个,因为我在VMBox上安装了WinXP而我无法再次使用它。

这次我在表单上创建了一个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)上的dll混合在一起,所以我采取了行动,现在它的程序属性设置为使用NET 3.5

在VMBox上我有.NET 2.0,但这不是问题 - 程序本身运行正常。我也有C ++ Redistributable(2005,2005 SP1和2008)。

可能是什么问题?

4 个答案:

答案 0 :(得分:3)

如果你打电话可以进一步麻烦

Marshal.GetLastWin32Error();

应该会给你一个错误代码。

是否有可能部署了本机dll的调试版本,这也需要调试版本的MSVCR90 D .DLL?您应该已分发发行版本,因为调试版本需要在目标系统上存在一组不同的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 :(得分:1)

在LoadLibrary之后调用GetLastError,在此处检查错误代码值:http://msdn.microsoft.com/en-us/library/ms681381.aspx 看看是否有帮助。

答案 2 :(得分:0)

可能是dll的位置在一个环境中而不在另一个环境中。它也可能是一个环境中的权限与另一个环境中的权限不同。

答案 3 :(得分:0)

尝试在DLL上运行dependency walker - 查看是否缺少任何模块。