【问题标题】:Cannot Load C++ DLL in C#无法在 C# 中加载 C++ DLL
【发布时间】:2009-04-09 18:18:43
【问题描述】:

>My previous thread<

我创建了这个,因为我在 VMBox 上安装了 WinXP,但我无法让它再次工作。

这次我在表单上创建了一个 OnLoad 事件

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

在我的 PC 上运行良好,但在 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)。

可能是什么问题?

【问题讨论】:

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


    【解决方案1】:

    如果您有更多麻烦可以致电

    Marshal.GetLastWin32Error();
    

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

    是否有可能您部署了本机 dll 的调试版本,而这也需要 MSVCR90D.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;
    }
    

    【讨论】:

    • As String 我得到“这个应用程序无法启动,因为它的应用程序配置不正确”。错误代码是14001。请告诉我如何修复dll的应用程序配置?在 DLL 项目文件夹中,我有两个文件 - Blowfish 和 Debug。dll 来自 Debug 文件夹。
    • 你可以试试发布版本吗?
    • 我不知道调试和发布版本之间的区别,我不知道如何让它编译发布版本,但是现在,谢谢你 - 我知道!数以百万计的感谢好友!
    • 对于 64 位系统,FormatMessage 声明应该是固定的,因为我相信 lpSource 和 Arguments 是指针,而不是整数。
    • @SimonMourier:完全正确,我修正了声明。
    【解决方案2】:

    LoadLibrary 后调用GetLastError,这里查看错误码值:http://msdn.microsoft.com/en-us/library/ms681381.aspx 看看有没有帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 查看我之前的帖子,超链接是第一行!我不需要 LoadLibrary,我使用外部函数。我只是设置该代码以确保问题出在 dll 中。
      【解决方案4】:

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

      【讨论】:

      • 如果缺少由依赖树中的任何库动态加载的 dll,您将无法使用依赖遍历器跟踪它。所以缺少库可能仍然是原因。
      • 你是对的,迪沃。但是,Dependency Walker(较新版本)有一个分析模式,它实际上可以帮助跟踪这些动态加载的模块。
      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多