C の .DLL ファイルがあります。その DLL 内のすべての関数に必要な主要な構造は、次の形式です。
typedef struct
{
char *snsAccessID;
char *snsSecretKey;
char *snsPath;
char *snsTopicName;
char *snsTopicAmazonResourceName;
char *snsDisplayName;
char *snsOwnerId;
} snsTopic, *HSNS;
たとえば、関数の1つは次のとおりです。
BOOL SnsOpenTopic(char *accessID, char *secretKey, char *ownerId, char *path, char *topicName, char *displayName, HSNS *snsTopicHandle);
上記のすべての char ポインターは入力パラメーターです。
WinCE6/7 デバイスで .NET CF 3.5 で C# を使用しています。
クラスを使用してから、次のように 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# コードの何が問題なのかわかりませんか?
私が試したもう 1 つのことは、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 で検索してみました。私のようなユースケースは見つかりませんでした。