【发布时间】:2017-04-21 09:33:12
【问题描述】:
我在 dll 中有一个 C++ 函数:
VARIANT __stdcall CallBlah(LPCSTR sA, LPCSTR sB, LPCSTR sC, LPCSTR sD, LPCSTR sE, LPCSTR sF)
{
char *srtnstring = NULL
... do stuff ...
_bstr_t bstrt(srtnstring);
return _variant_t(bstrt)
}
我正在尝试在一个 c# 应用程序中使用它,但我遇到了 Variant 返回类型的问题。我的 c# 导入是:
[DllImport("MyDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr callBlah(
string A,
string B,
string C,
string D,
string E,
string F);
但是当我运行 c# 应用程序时,我得到了一个不平衡的堆栈异常。 dllImport c# 签名的返回类型应该是什么?
提前致谢。
【问题讨论】:
-
您可以将
VARIANT*编组为IntPtr,但不确定您是否真的可以编组副本。 -
如果您可以更改 C++ 代码,那么将变体替换为更简单的类型会容易得多。
-
封送它为
object -
这是第 3 方 dll,所以我无法更改它。如果我确实将返回时间更改为对象,我会得到
PInvoke restriction:cannot return variants. -
那么我建议最好的方法是用另一个互操作友好的 DLL 包装损坏的 DLL。