我在 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);
上面所有的 char 指针都是输入参数。
我在 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))
{
}
}
在上述情况下,在调试中我可以检查结构内的指针没有被填充,并且在调试视图中我可以看到无效引用。无法取消引用指针消息。其余功能因此而失败。
在上述场景中使用平台调用和编组的正确方法是什么。我曾尝试在 Google 和 Stack Overflow 上进行搜索。没有找到与我类似的用例。