通过LoadLibrary从纯C ++程序加载托管C ++ DLL

时间:2009-04-16 17:54:19

标签: c++ dll loadlibrary

我试图在Managed C ++和普通C ++之间进行简单的混合。我正在使用Visual Studio 2005,但仍然遇到问题。这是我的设置。

首先,我有一个从代码构建的简单DLL

#using "mscorlib.dll"

#include "windows.h"

__declspec(dllexport)
void sayHello()
{
    OutputDebugStringA( "Hello from managed code!" );
}

我使用

在命令行上将其编译为DLL
cl /CLR /LD dllcode.cpp

接下来,我有一个简单的程序,只包含

#include <windows.h>
int main()
{
    HINSTANCE lib = LoadLibrary( "dllcode.dll" );
    if ( !lib ) {
        return 1;
    }
    return 0;
}

我使用

构建了一个应用程序
cl loader.cpp

所以我最终在同一目录中使用dllcode.dllloader.exe。尝试运行loader.exe时,我总是得到返回代码'1'。查找由GetLastError()产生的错误代码,表明因dllcode.dll

而加载The specified module could not be found.失败

有人知道为什么会这样吗?它是否与需要嵌入dllcode.dll左右的清单有关?我在dllcode.dll上运行了依赖程序,但就我所知,它没有产生任何问题。

2 个答案:

答案 0 :(得分:3)

我刚刚发现为什么从我的vanilla C ++程序加载Managed C ++ DLL不起作用。再次感谢jdigital为我指出了一个有用的工具:

错误的来源是找不到MSVC8运行时库。我认为通过

建立时产生的清单
cl /CLR /LD dllcode.cpp

已经嵌入到DLL中。显然,它不是 - 所以加载器找不到合适的MSVCR80.dll副本。

我通过向DLL构建例程添加第二步来修复此问题:

cl /CLR /LD dllcode.cpp
mt -manifest dllcode.dll.manifest -outputresource:dllcode.dll;2

希望这会有所帮助。我怀疑是一个初学者问题......

答案 1 :(得分:0)

您可以尝试使用filemon查看LoadLibrary正在尝试加载的内容。