从C#调用C ++函数时发生EntryPointNotFoundException

时间:2015-01-15 04:50:49

标签: pinvoke dllimport dllexport

我希望调用Score_Update1.dll中的C ++函数(此处为Score())。 C#& C ++文件成功编译。我还把上面的dll放到了C#项目的Debug / bin中。但是当我运行C#代码时,它会给出EntryPointNotFoundException。 这个例外背后的原因是什么? 我为Score_Update1.dll尝试了依赖walker。但它没有显示任何入口点

我希望使用PInvoke技术从C#

调用C ++函数
            // Score_Update1.h

            #pragma once

            #include <iostream>
            using namespace std;
            using namespace System;
            extern "C"{
            #define MYAPI __declspec(dllexport) 


            namespace Score_Update1 {
                public class MYAPI UpdateScore
                {
                    // TODO: Add your methods for this class here.
                    public:
                         void Score();
                };
            }
            }


            // This is the main Score_Updat1.dll DLL file.

            #include "stdafx.h"

            #include "Score_Update1.h"
            using namespace Score_Update1;

            void UpdateScore::Score()
            {
                cout<<"Score has been updated";
            }

C#代码如下:

            using Score_Update1;
            using System.Runtime.InteropServices;

            namespace GameTesting
            {
                class Game
                {
                    [DllImport("Score_Update1.dll")]
                    internal extern static void Score();

                    static void Main(string[] args)
                    {
                        try
                        {
                            Game.Score();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }

                    }
                }
            }

1 个答案:

答案 0 :(得分:0)

EntryPointNotFoundException的原因是DLL不包含名为Score的入口点。如果使用dumpbin或类似工具查看导出的名称,您将看到错位的名称。

但是,使用损坏的名称不会对您有所帮助。您已导出一个类,您要调用的函数是一个成员函数。您无法直接从pinvoke实例化C ++类。而你不能调用成员函数。如果您希望使用pinvoke,则需要将类展平为C样式界面。另一种方法是将C ++代码编译为混合模式C ++ / CLI程序集并使用它。