私はこれをc#から機能させようとしています:
C ヘッダー:
typedef void (LogFunc) (const char *format, va_list args);
bool Init(uint32 version, LogFunc *log)
C# 実装:
static class NativeMethods
{
[DllImport("My.dll", SetLastError = true)]
internal static extern bool Init(uint version, LogFunc log);
[UnmanagedFunctionPointer(CallingConvention.Cdecl, SetLastError = true)]
internal delegate void LogFunc(string format, string[] args);
}
class Program
{
public static void Main(string[] args)
{
NativeMethods.Init(5, LogMessage);
Console.ReadLine();
}
private static void LogMessage(string format, string[] args)
{
Console.WriteLine("Format: {0}, args: {1}", format, DisplayArgs(args));
}
}
ここで起こることは、 への呼び出しがNativeMethods.Init
コールバックLogMessage
し、アンマネージ コードからのデータをパラメーターとして渡すことです。これは、引数が文字列であるほとんどの場合に機能します。ただし、次の形式の呼び出しがあります。
バージョン %d のプラグイン %s をロードしました。
args には文字列 (プラグイン名) のみが含まれます。string[]
デリゲート宣言で使用したため、バージョン値は含まれていません。質問は、文字列と int の両方を取得するデリゲートをどのように記述すればよいですか?
使用してみobject[] args
ましたが、この例外が発生しました:
アンマネージ VARIANT からマネージ オブジェクトへの変換中に、無効な VARIANT が検出されました。無効な VARIANT を CLR に渡すと、予期しない例外、破損、またはデータの損失が発生する可能性があります。
編集:デリゲート署名を次のように変更できます:
internal delegate void LogFunc(string format, IntPtr args);
形式を解析して、予想される引数の数と型を調べることができました。たとえば、バージョン %d のロード済みプラグイン %s の場合。文字列とintが必要です。その IntPtr からこれら 2 を取得する方法はありますか?