我以为这是相当简单的,但是仍然试图理解所有这些并遇到一些问题。

我对C函数b / c不太了解,我所获得的信息有限。

这是C语言中的函数调用:

int GetCard(CardInfo card);


这是请求结构:

typedef struct _tCardInfo
{
    char CardNumber[80];
    char isExist;

} TCardInfo, *pTCardInfo;


我想传递卡号以查看是否存在。

因此,在C#中,我执行了以下操作:

public struct CardInfo
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string cardNumber;

    public byte isExist;
}

[DllImport("card.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern int GetCardInfo(ref CardInfo cardInfo);


然后在c#方法中:

CardInfo cardInfo = new CardInfo();

cardInfo.cardNumber = "1234567890";

int success = GetCardInfo (ref cardInfo);


关于我正在调用的DLL的好处是它会生成一个日志文件。
当我执行调用时,日志告诉我我正在访问DLL,但未传递卡号,然后设置了一条消息,指出卡号未传递。

任何帮助是极大的赞赏。
谢谢!

最佳答案

问题是您正在请求TChar封送处理,但是DLL需要8个字节的字符。将C结构更改为wchar_t。

另外,使用Visual Studio在DLL中设置一个断点,并在输入数据时实际检查数据! Visual Studio可以跨.NET /本机边界进行调试,这非常酷!

09-29 23:58