非托管导出,从C++;到C# 我使用包来调用C++到C语言。 这必须使用C++内部的C接口。我已经设法使大多数事情都能正常工作,通过搜索网络,到处搜集信息 extern "C" { // Simple __declspec(dllimport) int IntTest(int input); __declspec(dllimport) double DoubleTest(double input); // Array of simple types in __declspec(dllimport) int passArray(int t[], int i, int xx); // String in and out __declspec(dllimport) int PassStringIn(wchar_t* str); __declspec(dllimport) int PassStringOut(wchar_t** str); __declspec(dllimport) wchar_t* PassStringInOut(wchar_t* str); // Array of strings types in //__declspec(dllimport) int passArrayStrings(char** t, int i); }

非托管导出,从C++;到C# 我使用包来调用C++到C语言。 这必须使用C++内部的C接口。我已经设法使大多数事情都能正常工作,通过搜索网络,到处搜集信息 extern "C" { // Simple __declspec(dllimport) int IntTest(int input); __declspec(dllimport) double DoubleTest(double input); // Array of simple types in __declspec(dllimport) int passArray(int t[], int i, int xx); // String in and out __declspec(dllimport) int PassStringIn(wchar_t* str); __declspec(dllimport) int PassStringOut(wchar_t** str); __declspec(dllimport) wchar_t* PassStringInOut(wchar_t* str); // Array of strings types in //__declspec(dllimport) int passArrayStrings(char** t, int i); },c#,c++,c,c#-4.0,interop,C#,C++,C,C# 4.0,Interop,对应的C# 不管怎样,任何人都可以帮助传入和传出字符串数组。我很确定C#部分应该是这样的: [DllExport(CallingConvention = CallingConvention.Cdecl)] public static int passArrayStrings( [In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)] st

对应的C#

不管怎样,任何人都可以帮助传入和传出字符串数组。我很确定C#部分应该是这样的:

    [DllExport(CallingConvention = CallingConvention.Cdecl)]
    public static int passArrayStrings( [In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)]  string[] tab, int i)
    {

        return 1;
    }
在C++(C)方面,我需要一些关于如何在中构造字符串数组的帮助,以便正确封送它们。创建的混合模式程序集既有C#接口又有C接口。由于是C而不是C++,暴露函数的参数类型不可见。p>


谢谢

您可以使用IntPtr参数

无论如何,您都必须分配非托管内存并将数组复制到该blob中。否则GC将在某个时候吃掉您的数组


好吧,经过一番讨论,我找到了一个解决方案:

//  Array of strings types in
__declspec(dllimport) int passArrayStrings(BSTR* bstrArray, int i);

BSTR bstrArray[10] = { 0 };
for (int i = 0; i < 10; i++)
{
    bstrArray[i] = ::SysAllocString(L"My String.");
}
int ff = passArrayStrings(bstrArray, 10);
for (int i = 0; i < 10; i++)
{
    ::SysFreeString(bstrArray[i]);
}

我很高兴知道你认为我做错了什么。只是否决投票并没有真正的帮助,是吗?嗨,罗伯特,我是问这个问题的人,但我没有否决这个答案,不知道是谁否决了?事实上,我刚刚登录到stack overflow并看到了您的答案。让我研究一下你的答案,然后再给你回复。谢谢SeanHi Robert,我终于成功了。我使用了BSTR阵列:
    [DllExport(CallingConvention = CallingConvention.Cdecl)]
    public static int passArrayStrings( [In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)]  string[] tab, int i)
    {

        return 1;
    }
//  Array of strings types in
__declspec(dllimport) int passArrayStrings(BSTR* bstrArray, int i);

BSTR bstrArray[10] = { 0 };
for (int i = 0; i < 10; i++)
{
    bstrArray[i] = ::SysAllocString(L"My String.");
}
int ff = passArrayStrings(bstrArray, 10);
for (int i = 0; i < 10; i++)
{
    ::SysFreeString(bstrArray[i]);
}
    [DllExport(CallingConvention = CallingConvention.Cdecl)]
    public static int passArrayStrings([In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.BStr, SizeParamIndex = 1)]  string[] tab, int iSize)
    {
        return 1;
    }