用C#包装一个Dll的函数使用有问题,请各位指点一下,急

dgvictor 2004-09-10 11:45:58
有三个文件netpay.dll netpay.lib netpay.h
现在想用C#包装netpay.dll的函数 先测试其中一个函数
int __cdecl signOrder(char MerId[15], char OrdId[16], char TransAmt[12], char CuryId[3], char TransDate[8], char TransType[4], char ChkValue[256]);

在C#中包装如下:
[DllImport("netpay.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Cdecl)]
public static extern int signOrder(string MerId, string OrdId, string TransAmt, string CuryId, string TransDate,string TransType,ref string ChkValue);


运行测试提示如下:
异常详细信息: System.EntryPointNotFoundException: 无法在 DLL netpay.dll 中找到名为 signOrder 的入口点。


...全文
163 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
eTopFancy 2004-09-10
  • 打赏
  • 举报
回复
统一楼上的,我也是这么用的

如果是.net开发的,引入命名空间
其他语言工具开发,需要按楼主的用法
mywebcom 2004-09-10
  • 打赏
  • 举报
回复
我调用.dll,怎么不是你这种方式,只要引入命名空间就可以了。
dgvictor 2004-09-10
  • 打赏
  • 举报
回复
加EntryPoint="signOrder " 还是抛出一样的异常呀。。。System.EntryPointNotFoundException: 无法在 DLL netpay.dll 中找到名为 signOrder 的入口点。

The123 2004-09-10
  • 打赏
  • 举报
回复
[DllImport("netpay.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Cdecl)]
--〉
[DllImport("netpay.dll", EntryPoint="signOrder ",CharSet=CharSet.Auto, CallingConvention=CallingConvention.Cdecl)]


The123 2004-09-10
  • 打赏
  • 举报
回复
DLL是人家提供的。。。
----------------------
跟他们协商,要源代码,不然就自己用托管代码写个功能一样的
wybin 2004-09-10
  • 打赏
  • 举报
回复
最大的可能就是,对方在编写DLL的时候,没有将__declspec(dllexport)修饰符加到函数定义前面.
另外,在DEF文件的

EXPORTS

下面要填写响应的函数名称。
dgvictor 2004-09-10
  • 打赏
  • 举报
回复
DLL是人家提供的。。。
The123 2004-09-10
  • 打赏
  • 举报
回复
VC++要在函数定义前加__declspec(dllexport)修饰符才可以被外部程序调用
你那个是用什么东西写的DLL?
The123 2004-09-10
  • 打赏
  • 举报
回复
CallingConvention=CallingConvention.StdCall
eTopFancy 2004-09-10
  • 打赏
  • 举报
回复
在单元文件的开头引用类库的命名空间了没有?
using yourdll.namespace;
tongeng 2004-09-10
  • 打赏
  • 举报
回复
代码看上去没有问题
EntryPoint="signOrder"这句话加不加没有关系
因为你用的是和dll里面同名的函数
默认就是这个啦
你还是看一下dll里面是不是叫这个函数名吧
wnlovezxm 2004-09-10
  • 打赏
  • 举报
回复
帮顶
dgvictor 2004-09-10
  • 打赏
  • 举报
回复
无论是用string 来设置参数 还是用Char[] 参数都提示DLL中找不到signOrder 入口,疯了。。
dgvictor 2004-09-10
  • 打赏
  • 举报
回复
不行,都疯了。。
using System;
using System.Runtime.InteropServices ;
namespace ChinaPay
{
public class NetPay
{
/// <summary>
/// 订单签名函数signOrder
/// </summary>
/// <param name="MerId">商户号,长度为15个字节的数字串,由ChinaPay在商户入网时分配。</param>
/// <param name="OrdId">订单号,长度为16个字节的数字串,由商户系统生成,两天内不能重复。</param>
/// <param name="TransAmt">交易金额,长度为12个字节的数字串,例如:数字串"000000001234"表示12.34元。</param>
/// <param name="CuryId">货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为"156"</param>
/// <param name="TransDate"> 交易日期,长度为8个字节的数字串,表示格式为: YYYYMMDD</param>
/// <param name="TransType">交易类型,长度为4个字节的数字串,取值范围为:"0001"和"0002", 其中"0001"表示消费交易,"0002"表示退货交易。</param>
/// <param name="ChkValue">校验值,即NetPayClient根据上述输入参数生成的商户数字签名, 长度为256字节的字符串。</param>
/// <returns></returns>
[DllImport("ChinaPay.dll", EntryPoint="signOrder",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)]
public static extern int signOrder([MarshalAs(UnmanagedType.LPArray,SizeConst = 15)] Char[] MerId, [MarshalAs(UnmanagedType.LPArray,SizeConst = 16)] Char[] OrdId, [MarshalAs(UnmanagedType.LPArray,SizeConst = 12)] Char[] TransAmt, [MarshalAs(UnmanagedType.LPArray,SizeConst = 3)] Char[] CuryId, [MarshalAs(UnmanagedType.LPArray,SizeConst = 8)] Char[] TransDate,[MarshalAs(UnmanagedType.LPArray,SizeConst = 4)] Char[] TransType,[MarshalAs(UnmanagedType.LPArray,SizeConst =256)] Char[] ChkValue);


}
}

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧