我目前正在开发.NET Framework 4.7.2应用程序。我需要使用来自本地 unmanaged C ++ DLL的一些业务逻辑。我的项目中不允许使用公共语言运行库。
我尝试将字符串从C#来回发送到C ++。看来工作正常,我可以将字符串发送到DLL,然后得到结果。但是,如果我从C#向C ++发送更长的字符串,则会遇到错误,例如:“ fourtytwo”的结果为“ f” ,仅返回第一个字母。它实际上应该返回“ fourtytwo”。
我的C#编码如下:
var test = TestProxy.Wrapper_Create("test");
// string
var pc = TestProxy.TryString(test, "fourtytwo");
var c = Marshal.PtrToStringAnsi(pc); // problem: results in "f" instead of "fourtytwo"
我在C#中的封送处理定义如下:
public static class TestProxy
{
private const string coreDLL = "test.core.dll";
[DllImport(coreDLL, EntryPoint = "?TryString@TestClass@@XXX@X", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr TryString(IntPtr instance, [MarshalAs(UnmanagedType.LPTStr)]string n);
}
我的C ++看起来像这样:
头文件:
#ifdef TESTCORE_EXPORTS
#define TESTCORE_API __declspec(dllexport)
#endif
#pragma once
#include <iostream>
using namespace std;
extern "C"
{
class TESTCORE_API TestClass
{
private:
char* name;
public:
TestClass(char*);
char* TryString(char*);
};
TESTCORE_API TestClass* Wrapper_Create(char* name);
}
C ++中的实现如下所示:
#include "stdafx.h"
#include "TestCore.h"
TestClass::TestClass(char* n)
{
name = n;
}
char* TestClass::TryString(char* n)
{
return n; // Something goes wrong here, only "f" returned instead of "fourtytwo"
}
extern "C"
{
POMCORE_API TestClass * Wrapper_Create(char* name)
{
return new TestClass(name);
}
POMCORE_API char* TryString(TestClass * instance, char* n)
{
if (instance != NULL)
{
return instance->TryString(n);
}
}
}
您知道如何正确地将字符串从C#编组到C ++并返回吗?
谢谢!