在我的应用程序中,我有 2 层。第一层是 C 遗留的公开 cdecl 函数,它使用“...”语法来处理不同的参数列表。我发现从我的 .Net 层(第二个)调用这些函数的唯一方法是使用 DllImport 技术。例如下面的 C 函数:
int myFunc(char* name, ...);
在 C# 中看起来像这样:
[DllImport("MyDll.dll"),
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl]
int myFunc(string name, __arglist);
我的问题是,有时我想用 2 个额外参数调用此函数,但如果其中一个为 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]);
有人知道吗?