【问题标题】:how to use unmanaged .dll, .lib, .exp in c++ project如何在 C++ 项目中使用非托管 .dll、.lib、.exp
【发布时间】:2017-06-20 15:50:36
【问题描述】:

我在这方面做得很差,所以我希望有人能给我一些关于如何进行的建议。

长话短说,我从一个 jar 开始,我在该 jar 上运行了一个名为 ikvm 的应用程序,以生成我的 java 类的 .net 库。这已经过测试并且工作正常。于是我有了一个.net dll,我使用monoaot 生成了一个非托管的.dll、.exp 和.lib,但没有头文件。我确实知道所涉及的类名和方法。

现在我想不通的是如何使用这些文件在没有头文件的 c++ 项目中使用这些类。我正在使用视觉工作室。如果有任何我遗漏的信息会有所帮助,请发表评论。

【问题讨论】:

    标签: c++ .net dll mono native


    【解决方案1】:

    如果你有一个未管理的 DLL,那么有很多方法可以使用 c++。

    一种简单的方法是使用 LoadLibrary() 和 GetProcAddress() 函数。例如:

    //Define the function prototype
    typedef int (CALLBACK* FirstFunction)(LPCTSTR);
    
    void main()
    {
       HINSTANCE dllHandle = NULL;              
       FirstFunction pFirstFunction = NULL;
    
       //Load DLL
        dllHandle = LoadLibrary("Your.dll");
    
       if(dllHandle != NULL)
       {
          //Get pointer to function FindBook
          pFirstFunction = (FirstFunction)GetProcAddress(dllHandle,
             "FindBook");
    
          // If function pointer is valid then you can use it 
          if (pFirstFunction != NULL)
          {
             LPCTSTR strBook = "Duchamp";
             short nSuccessCode = pFirstFunction(strBook);
          }
    
       }
    
    }
    

    【讨论】:

    • 我想我明白其中的一部分,但我的绿色仍然潜伏着。假设我有一个名为“MyClass”的类,它的构造函数自动完成所有设置,然后我只需要调用一个方法来获取结果,该结果是我的 dll 中的另一个类(MyClass2)。在托管 .net 中,这看起来像: MyClass2 MyClass2Instance = (MyClass2) MyClassInstance.MyClassMethod(string str);我将如何进行设置?
    • 另外,当我阅读时,看起来我需要在我的 .lib 中添加链接器引用或其他内容?
    • LoadLibrary 不需要链接 .lib。您可以使用 Depends 或 DUMPBIN 来查找 DLL 的导出内容。我仍然不确定您是否有非托管 dll。
    • 好的,这就解释了。它绝对是一个非托管的 dll。使用 mono --aot=full 来编译它。它实际上只会在 x86、x86_64 ELF 上运行。我想我明白了你所说的,以及我发现的另一个视频。我得到了函数部分,但我该如何获得一个类?
    • 啊哈,我找到了另一个可以回答这个问题的线程。感谢您的回答,它向我展示了要查找的内容并解释了我没有得到的步骤! Herehere
    【解决方案2】:

    如果您没有头文件,您要么需要“制造”一个(根据 .dll 中的确切规范),要么动态加载库和函数 - 请参阅 LoadLibraryGetProcAddress

    要查看 dll 中的确切功能规范,您可以使用例如DependencyWalker(外部工具)或直接使用Visual Studio提供的dumpbin工具:

    dumpbin /exports thename.dll
    

    这将显示所有开始的导出。

    尤其要注意调用约定(stdcall、fastcall 等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2011-08-22
      • 2011-04-21
      • 1970-01-01
      • 2018-04-04
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多