[问题] C++ 呼叫 C# DLL

楼主: jim97260 (区欠足易)   2015-12-29 11:45:24
各位好
目前我们公司所使用的数据库是Oracle 8
使用的语言有 Oracle 的 D2K 以及 C#
现在的需求是我们有一些 C# 的 DLL
要使 D2K 中可以呼叫到这些DLL中的函式
而目前可行的做法是用 D2K 呼叫 C++ 的 DLL
因此我目前要做的就是使 C++ 能够呼叫到 C# 的 DLL
然后使 D2K 透过 C++ 呼叫到 C# 的 DLL
而我是参考 MSDN 上一篇文章
How to call a managed DLL from native Visual C++ code in Visual Studio.NET
连结: https://support.microsoft.com/en-us/kb/828736
的作法,在使用到 INT 或 FLOAT DOUBLE 这种型别的函式都顺利可用
唯有在使用到字串时会有问题
在 C++ 的参数为 LPWSTR (其实就是 wchar_t*)
我的作法是
将 C# 端的参数型别设为 ref StringBuilder 或 ref string 两种都用过
执行时都会发生
"尝试读取或写入受保护的内存。这通常表示其他内存已损毁。"
这种错误
而在 D2K 测试则会直接 CRASH 请问有人有类似经验能提供处理方法吗?
程式码:
C# DLL
public int testString1(ref string output)
{
output += "C# testString1 ref string";
return 1;
}
public int testString2(ref StringBuilder output)
{
output.Append("C# testString1 ref StringBuilder");
return 1;
}
C++ DLL
extern "C" _declspec(dllexport) int testStringCS1(LPWSTR output);
int _declspec(dllexport) testStringCS1(LPWSTR output)
{
HRESULT hr = CoInitialize(NULL);
ICalculatorPtr pICalc(__uuidof(ManagedClass));
long lResult;
pICalc->testString1(&output, &lResult);
CoUninitialize();
return 1;
}
作者: yeo1987 (Archie)   2015-12-29 22:16:00
COM Interop, 字串改BSTR试试

Links booklink

Contact Us: admin [ a t ] ucptt.com