私のアプリケーションでは、2つのレイヤーがあります。最初のレイヤーは、さまざまなパラメーターリストに「...」構文を使用するcdecl関数を公開するCレガシーです。.Netレイヤー(2番目のレイヤー)からこれらの関数を呼び出す唯一の方法は、DllImportテクニックを使用することです。たとえば、以下のC関数:
int myFunc(char* name, ...);
C#では次のようになります。
[DllImport("MyDll.dll"),
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl]
int myFunc(string name, __arglist);
私の問題は、2つの追加パラメーターを使用してこの関数を呼び出したい場合がありますが、そのうちの1つがNULLの場合、引数リストに含まれません(私のレガシーコードはNULL値で失敗します)。たとえば、私はこの呼び出しが必要です:
int foo(string name, string a, string b)
{
myFunc(name, __arglist(a, b));
}
{
foo("john", "arg1", null);
}
Cによって次のように解釈されます
myFunc("john", "arg1");
残念ながら、そのようなことをしています:
int foo(string name, string a, string b)
{
List<string> args = new List<string>();
if(a != null) args.Add(a);
if(b != null) args.Add(b);
myFunc(name, __arglist(args));
}
{
foo("john", "arg1", null);
}
Cによって次のように解釈されます。
myFunc(name, args);
ではなく:
myFunc(name, args[0]);
誰かが何か考えを持っていますか?