我希望调用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);
}
}
}
}
答案 0 :(得分:0)
EntryPointNotFoundException
的原因是DLL不包含名为Score
的入口点。如果使用dumpbin或类似工具查看导出的名称,您将看到错位的名称。
但是,使用损坏的名称不会对您有所帮助。您已导出一个类,您要调用的函数是一个成员函数。您无法直接从pinvoke实例化C ++类。而你不能调用成员函数。如果您希望使用pinvoke,则需要将类展平为C样式界面。另一种方法是将C ++代码编译为混合模式C ++ / CLI程序集并使用它。