[DllImport(@"F:\Hw\ConsoleApplication1\ConsoleApplication1\Location.dll", EntryPoint = "LocateBlob", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int LocateBlob(string imgbuf, int width, int height, out float imgpara, out float deltax, out float deltay);
“System.EntryPointNotFoundException”类型的未经处理的异常在 ConsoleApplication1.exe 中发生 其他信息: 无法在 DLL“F:\Hw\ConsoleApplication1\ConsoleApplication1\Location.dll”中找到名为“LocateBlob”的入口点。
public static extern int LocateBlob(string imgbuf, int width, int height, out float imgpara, out float deltax, out float deltay);
“System.EntryPointNotFoundException”类型的未经处理的异常在 ConsoleApplication1.exe 中发生 其他信息: 无法在 DLL“F:\Hw\ConsoleApplication1\ConsoleApplication1\Location.dll”中找到名为“LocateBlob”的入口点。
P/Invoke调用,只好是调用c类型的,
如果是c++的,有可能会更改函数名称,
更详细说明网搜 extern "C"的说明2.把c++ dll的函数定义贴出来
指针类型的,用ref来对应。
最好用def文件定义下导出
不然函数名字和你代码里的可能不同
比如加些_啊数字啊之类的
参考:https://blog.csdn.net/C_gyl/article/details/85325469
给个列子给你,下面是我写C+ 和 C# ,你可以参考下:c++ 函数声明 使用__stdcall调用约定//60、Defire高阶创文件
ReaderDLL int CallReader DesfireHLCreateFile(
UCHAR addr, //设备地址
UCHAR cid, //通道号, 一般为0x01
int AID, //子应用编号
UCHAR keyNo, //子应用主密钥编号 一般为0
UCHAR keyType, //子应用主密钥类型
UCHAR *keyData, //子应用主密钥数据
UCHAR fileID, //文件ID
UCHAR fileType, //文件类型
UCHAR commType, //文件的通讯方式 0: Plain; 1: MACing; 3: Full Enciphered;
UCHAR keyNoFile1, //更改文件的密钥KeyNO 和 读写文件KeyNo。
UCHAR keyNoFile2, //文件类型 写文件KeyNo, 读文件KeyNo
unsigned int fileSpace, //文件大小
unsigned int minValue, //最小值,4字节的整数,不能为负.
unsigned int maxValue, //最大值,4字节的整数
unsigned int initValue, //初始值
UCHAR creditFlag, //是否使用信用标志 0 不使用 1 使用
unsigned int oneRecordLen, //一个记录的大小,4字节的整数
unsigned int maxRecordNum); //最大记录数
C# 调用//64、Defire高阶创文件
[DllImport("ICReader.dll", EntryPoint = "DesfireHLCreateFile", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int DesfireHLCreateFile(
byte addr, //设备地址
byte cid, //通道号, 一般为0x01
int AID, //子应用编号
byte keyNo, //子应用主密钥编号 一般为0
byte keyType, //子应用主密钥类型
ref byte keyData, //子应用主密钥数据
byte fileID, //文件ID
byte fileType, //文件类型
byte commType, //文件的通讯方式 0: Plain; 1: MACing; 3: Full Enciphered;
byte keyNoFile1, //更改文件的密钥KeyNO 和 读写文件KeyNo。
byte keyNoFile2, //文件类型 写文件KeyNo, 读文件KeyNo
UInt32 fileSpace, //文件大小
UInt32 minValue, //最小值,4字节的整数,不能为负.
UInt32 maxValue, //最大值,4字节的整数
UInt32 initValue, //初始值
byte creditFlag, //是否使用信用标志 0 不使用 1 使用
UInt32 oneRecordLen, //一个记录的大小,4字节的整数
UInt32 maxRecordNum); //最大记录数
很大程度上是因为名字碾平的问题。
仔细查看一下导出的符号名字。
如果想要调用的话请使用dll查看器查看他的Origin,通过这个东西进行调用(需要在前面加一个#),比如,EntryPoint = "#1"