从C#调用VC ++ DLL时抛出错误[EntryPointNotFound]

时间:2015-03-16 10:57:22

标签: c# visual-c++ dllexport

这里我在vc ++ 2008中的DLL项目中创建。以下是两个代码文件lib.h和lib.cpp。

lib.h

   #include "stdafx.h";


    class __declspec(dllexport) test
    {
    public:
        test();
        static void  hello();
        static void  hello1();
    };

    class __declspec(dllexport) test1
    {
    public:
        test1();
        void  hello_test1();
        void  hello1_test1();

    };

lib.cpp

    #include "stdafx.h"
    #include "lib.h"
    #include <stdio.h>

    void test::hello()
    {   
        printf("Hello");
    }

    void test::hello1()
    {
        printf("Hello1");
    }

    void test1::hello_test1()
    {
        printf("Hello_test1");
    }

    void test1::hello1_test1()
    {
        printf("Hello1_test1");
    }

的stdafx.h

#include "targetver.h"
#define WIN32_LEAN_AND_MEAN 
// Windows Header Files:
#include <windows.h>

dllMain.cpp

#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

我编写了C#代码来调用test和test1类的方法:
ConsoleApp

    [DllImport("lib.dll" )]
    public static extern void hello();

    [DllImport("lib.dll")]
    public static extern void hello1();

    [DllImport("lib.dll")]
    public static extern void hello_test1();

    [DllImport("lib.dll")]
    public static extern void hello1_test1();

 static void Main()
{ 
        hello();
        hello1();
        hello_test1();
        hello1_test1();
        Console.ReadKey();
    }

当我运行上面的代码时,我遇到以下错误: EntryPointNotFoundException:无法找到名为&#39; hello&#39;的入口点。在DLL&#39; lib.dll&#39; enter image description here
我知道如何只调用C#中的vc ++ DLL函数(不使用Class),但我不知道如何调用任何类的方法以及如何在vc ++中以适当的方式编写代码。

我知道上面代码中的某个地方是错误的,请专家指导我关于我的错误,因为我尝试了所有这些。

如果有人有如上所述的完整示例,那么建议我。

提前致谢..

2 个答案:

答案 0 :(得分:0)

据我所知,无法直接从c#调用本机类方法。解决这个问题的典型方法是创建调用类方法并与之交互的非成员函数。有关更多细节,请参阅以下链接。它包含了您要做的事情的直接示例。

using a class defined in a c++ dll in c# code

在阅读了更多答案之后,它可能会显示,但链接会显示您正在寻找的示例。

答案 1 :(得分:-2)

@Jarrett感谢你让我转向Marshal概念。

我在这个项目中添加了testClass.h和testClass.cpp来编组C ++类

<强> testClass.h

#ifndef __testClass_h__
#define __testClass_h__

#include "lib.h"

#ifdef __cplusplus
extern "C" {
#endif

extern LIBDLL_API test* createTestClass();
extern LIBDLL_API void disposeTestClass(test* pObject);

extern LIBDLL_API void callHello(test* pObject);
extern LIBDLL_API void callHelloTest1Class(test1* pObject);

#ifdef _cplusplus

#endif
}
#endif

<强> testClass.cpp

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "stdafx.h"
#include "testClass.h"

extern "C" LIBDLL_API test* createTestClass()
{
    return new test();
}

extern "C" LIBDLL_API void disposeTestClass(test* pObject)
{
    if(pObject!=NULL)
    {
        delete pObject;
        pObject=NULL;
    }
}

extern "C" LIBDLL_API void callHello(test* pObject)
{
    if(pObject!=NULL)
    {
        pObject->hello();
    }
}

extern "C" LIBDLL_API void callHelloTest1Class(test1* pObject)
{
    if(pObject!=NULL)
    {
        pObject->hello_test1();
    }
}

<强> lib.h

#include "stdafx.h";
#ifdef LIB_EXPORTS
    #define LIBDLL_API __declspec(dllexport)
#else
    #define LIBDLL_API __declspec(dllimport)
#endif

class LIBDLL_API test
{
public:
    test();
    virtual ~test();
    static void  hello();
    static void  hello1();

};

class LIBDLL_API test1
{
public:
    test1();
     void  hello_test1();
     void  hello1_test1();

};

<强> lib.cpp

#pragma once
#include "stdafx.h"
#include "lib.h"
#include <stdio.h>
#include <iostream>

#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
#include <windows.h>


test::test()
{}
test::~test()
{}

void test::hello()
{   
    printf("\nHello");
}


void test::hello1()
{
    printf("Hello1");
}

void test1::hello_test1()
{
    printf("\nHello_test1");
}
void test1::hello1_test1()
{
    printf("Hello1_test1");
}

现在创建一个控制台应用程序并在program.cs文件中添加一些代码 的 Program.cs的

namespace ConsoleApplication1
{
    class ConsoleApplication1
    {

        static void Main()
        {
            CS_Test_Class testClass = new CS_Test_Class();
            testClass.hello();
            testClass.hello_test1();

            Console.ReadKey();
            testClass.Dispose();

        }

    }
}

program.cs调用CS_Test_Class.cs的方法所以.... 的 CS_Test_Class.cs

using System;
using System.Runtime.InteropServices; 
namespace ConsoleApplication1
{
    public class CS_Test_Class:IDisposable
    {
        [DllImport("lib.dll")]
        public static extern IntPtr createTestClass();

        [DllImport("lib.dll")]
        static private extern void disposeTestClass(IntPtr pTestClassObject);

        [DllImport("lib.dll")]
        static private extern void callHello(IntPtr pTestClassObject);

        [DllImport("lib.dll")]
        static private extern void callHelloTest1Class(IntPtr pTestClassObject);


        private IntPtr nativeObject;

        public CS_Test_Class()
        {
            this.nativeObject = createTestClass();
        }

        public void Dispose()
        {
            Dispose(true);
        }
        protected virtual void Dispose(bool bDisposing)
        {
            disposeTestClass(this.nativeObject);
            this.nativeObject = IntPtr.Zero;

            if (bDisposing)
                GC.SuppressFinalize(this);
        }

        ~CS_Test_Class()
        {
            Dispose(false);
        }

        public void hello()
        {
            callHello(this.nativeObject);
        }
        public void hello_test1()
        {
            callHelloTest1Class(this.nativeObject);
        }

    }
}

Marshling允许您访问c ++ Dll的类和方法。 Microsoft为Marshal C函数提供了工具,并为Marshal c ++ clases提供了机制。

享受Marshling ...... 谢谢。