1

我认为这是相当直截了当的,但仍然试图理解所有这些并遇到一些问题。

我对 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,但它没有传递卡号,然后设置一条消息说卡号没有传递。

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

4

3 回答 3

1

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

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

于 2013-09-20T16:55:46.260 回答
0

尝试像这样创建 .Net 结构:

    [StructLayout(LayoutKind.Sequential)]
    public struct CardInfo
    {
        [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 80)]
        public string cardNumber;

        [MarshalAs(UnmanagedType.I1)]
        public sbyte isExist;
    }

而对于函数声明:尽量不要在DLL导入中使用and,使用CallingConvention参数前的属性。像这样:CharSet[In, Out]

[DllImport("card.dll")]
public static extern int GetCardInfo([In, Out] CardInfo cardInfo);
于 2013-09-20T13:17:13.753 回答
0

尝试为结构添加属性 StructLayout

[StructLayout(LayoutKind.Sequential)]
public struct CardInfo
{
...
于 2013-09-20T13:11:03.173 回答