gpt4 book ai didi

c# - 通过 P/Ivoke 在 C# 中传递 Struct 指针(主体中带有 char 指针)

转载 作者:行者123 更新时间:2023-11-30 13:01:44 27 4
gpt4 key购买 nike

我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。

typedef struct
{
char *snsAccessID;
char *snsSecretKey;
char *snsPath;
char *snsTopicName;
char *snsTopicAmazonResourceName;
char *snsDisplayName;
char *snsOwnerId;
} snsTopic, *HSNS;

仅举例其中一个函数如下:

BOOL SnsOpenTopic(char *accessID, char *secretKey, char *ownerId, char *path, char *topicName, char *displayName, HSNS *snsTopicHandle);

上面所有的字符指针都是输入参数。

我在 WinCE6/7 设备上使用 C# 和 .NET CF 3.5。

我试过使用一个类,然后将指针传递给 C 函数所需的结构,如下所示:

public class HSNS
{
public string snsAccessID;
public string snsSecretKey;
public string snsPath;
public string snsTopicName;
public string snsTopicAmazonResourceName;
public string snsDisplayName;
public string snsOwnerId;
}

[DllImport("Cloud.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SnsOpenTopic(string accessID, string secretKey, string ownerId, string path, string topicName, string displayName, ref HSNS snsTopicHandle);

使用上面的 C# 代码片段会导致抛出 NotSupportedException。我无法弄清楚上面的 C# 代码有什么问题?

我尝试的另一件事是在 C# 中使用非托管代码。

unsafe public struct HSNS
{
public char *snsAccessID;
public char *snsSecretKey;
public char *snsPath;
public char *snsTopicName;
public char *snsTopicAmazonResourceName;
public char *snsDisplayName;
public char *snsOwnerId;
}

[DllImport("Cloud.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SnsOpenTopic(string accessID, string secretKey, string ownerId, string path, string topicName, string displayName, HSNS *snsTopicHandle);

fixed (HSNS *snsAcsTopicHandle = &snsAcsTopic)
{
if (SnsOpenTopic(AWS_ACCOUNT_ACCESS_ID, AWS_ACCOUNT_SECRET_KEY, AWS_ACCOUNT_OWNER_ID, AWS_SNS_SINGAPORE_REGION, topicName, displayName, snsAcsTopicHandle))
{
}
}

在上面的例子中,在调试中我可以检查结构内部的指针没有被填充,在调试 View 中我可以看到无效引用。无法取消引用指针消息。其余功能因此而失败。

在上述场景中使用平台调用和编码的正确方法是什么。我试过在 Google 和 Stack overflow 上搜索。没有找到与我相似的用例。

最佳答案

我相信您对 char* 使用 IntPtr,对结构使用“ref”

[DllImport("Cloud.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SnsOpenTopic(string accessID, string secretKey, string ownerId, string path, string topicName, string displayName, ref HSNS snsTopicHandle);

[StructLayout(LayoutKind.Sequential)]
public struct HSNS
{
public IntPtr snsAccessID;
public IntPtr snsSecretKey;
public IntPtr snsPath;
public IntPtr snsTopicName;
public IntPtr snsTopicAmazonResourceName;
public IntPtr snsDisplayName;
public IntPtr snsOwnerId;
}

然后,当您想要访问您的结构结果时,您需要将 IntPtr 编码为字符串。

http://msdn.microsoft.com/en-us/library/7b620dhe.aspx

System.Runtime.InteropServices.Marshal.PtrToStringAnsi(snsTopicHandler.snsPath);

http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx

System.Runtime.InteropServices.Marshal.PtrToStringAuto(snsTopicHandler.snsPath);

关于c# - 通过 P/Ivoke 在 C# 中传递 Struct 指针(主体中带有 char 指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17929489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com