在.Net外部组件中使用C ++本机DLL会引发异常

我试图在C#中使用本机C ++ dll,并得到“外部组件引发异常”,错误代码为-2147467259。

C#:

[DllImport(@"MyDLL.dll", CharSet = CharSet.Auto)]
public static extern string MyFunction([MarshalAs(UnmanagedType.LPStr)] StringBuilder input);

C ++:

__declspec(dllexport) char * __stdcall MyFunction(const char* inputPtr);

该函数在C ++中工作得很好。 我怎样才能追踪这个错误? 我曾尝试使用字符串和字符串生成器的参数。

更新

我发现这篇文章http://tom-shelton.net/index.php/2008/12/11/creating-a-managed-wrapper-for-a-lib-file/

它详细介绍了一种使用托管C ++封装C ++中的非托管静态库的方法,然后可以使用托管语言。 这是解决这个问题的好方法吗? 该lib可以是一个非托管的DLL?


尝试从http://blog.rednael.com/2008/08/29/MarshallingUsingNativeDLLsInNET.aspx - 这已经保存了几天:-)的技术


如果参数是in-only(而不是out),则不需要stringbuilder。 如果它是out参数(或ref),则应使用stringbuilder并使用stringbuilder构造函数预先分配缓冲区。

我可以猜测问题是,你正在返回一个Ansi字符串,而不是预期的unicode字符串。 这会导致默认的pinvoke封送处理器读取太多的内存。

试试这个:[DllImport(@“MyDLL.dll”,CharSet = CharSet.Auto)] [[MarshalAs(UnmanagedType.LPStr)]

无论如何,绝大多数时候,编写Ansi C ++代码都没有任何意义。 我建议只将C ++代码转换为unicode(不是tchar,而是wchar_t)。


CharSet = CharSet.Auto? 使用CharSet.Ansi

你不能使用char数组作为返回,用C ++分配的内存块不能被C#使用! 在你的情况下,你可能需要将它复制到C#托管内存中。 使用StringBuilder作为该属性或MarshalAs属性,将为您复制缓冲区到C#托管内存中。

你必须改变你的C ++函数,你的C ++函数必须写入必须分配的目标缓冲区,以便它至少包含你需要的字符数加上一个(对于空字符)。

[DllImport(@"MyDLL.dll", CharSet = CharSet.Ansi)]
private static extern void MyFunction([MarshalAs(UnmanagedType.LPStr)] string input, StringBuilder result);

public static string MyFunctionPublic(string input)
{
    StringBuilder sb = new StringBuilder(input.Length + 1);
    MyFunction(input, sb);
    return sb.ToString();
}

我希望你的C函数能做到这样的事情:

void __stdcall MyFunction(const char* input, char* result)
{
    strcpy(result, input); // this is a dummy stupid code to show how it works.
}

可能你需要一个函数,让你知道你需要在C#中分配多少字节。 这个功能可以是这样的:

int __stdcall ComputeMyFunctionBytes(const char* input)
{
    return strlen(input); // this is a dummy stupid code to show how it works.
}

不要将一块分配的内存返回给C#,在使用不安全的代码之前,它不能执行任何操作,也不能解除分配,也不能读取或写入内容,但这不是您正在尝试执行的操作。

好文章似乎在这里:http://www.devx.com/dotnet/Article/6990/1954

另请注意,C#使用unicode,每个字符16位,因此它将从ansi转换为unicode。

链接地址: http://www.djcxy.com/p/44451.html

上一篇: Using C++ native dll in .Net External component has thrown an exception

下一篇: import c++ dll to windows phone project