从C#到C ++正确地封送字符串

时间:2019-01-08 15:49:16

标签: c# c++ marshalling

我目前正在开发.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 ++并返回吗?

谢谢!

0 个答案:

没有答案