从C#调用非托管C ++ VS 6.0 MFC dll

时间:2009-12-16 20:03:21

标签: c# c++ mfc

我有一个在VS 6.0中开发的非托管C ++ MFC dll。我想在我的C#应用​​程序中使用它。我正在尝试使用PInvoke。

这是C ++代码:

// testDll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"


extern "C" {

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

 __declspec(dllexport) int test(int a)
{
    return a * a;
}
}

以下是我试图从C#调用方法“test”:

// PInvokeTest.cs
using System;
using System.Runtime.InteropServices;

class PlatformInvokeTest
{

    [DllImport("TestDll.dll")]
    internal static extern int test(int number);

    public static void Main()
    {
        Console.WriteLine(test(5));     
    }
}

当我将C ++ dll设置为常规Win32 dll时,这种方法可以正常工作。

但是一旦我将项目类型更改为MFC(“在共享DLL中使用MFC”),我就会收到此错误:

未处理的异常:System.DllNotFoundException:无法加载DLL'TestDll.dll':找不到指定的模块。 (来自HRESULT的异常:0x8007007E)    在PlatformInvokeTest.test(Int32号码)

谢谢!

3 个答案:

答案 0 :(得分:1)

DLL需要位于系统可以拾取它的路径中。你把它放在你的应用程序启动的目录中? (可能在你VS解决方案的DEBUG文件夹中)。

第二个选项是为它提供DLL的绝对路径。

第三个选项是将它放在“c:\ windows \ System”中,但这是'-1'方法:D

答案 1 :(得分:1)

通常,当您遇到这样的错误时,可以使用Assembly Binding Log Viewer来确定dll是否由于缺少依赖而无法加载。

在您的特定情况下,最可能的原因是您正在动态地将您的dll链接到MFC,并且当C#应用程序尝试加载您的dll时,它无法加载MFC dll。

您可以并排复制所需的MFC dll,也可以切换到静态链接MFC到lib。

答案 2 :(得分:1)

TestDll.dll可能无法加载其中一个依赖DLL。

尝试在Depends(Dependency Walker)实用程序中加载TestDll.dll文件。应该在Microsoft Visual Studio 6.0工具下使用VC 6安装。这将向您展示DLL具有哪些依赖关系,并在其中一个依赖关系失败时标记。

确保从C#代码所在的文件夹中加载TestDll.dll。

请注意,Depends仅适用于非托管DLL。