如何将C ++中的字符串指针/引用传递给C#?

时间:2014-09-08 11:09:47

标签: c# c++ pointers com com-interop

我正在写一个C#com库。我需要一个从C ++中获取字符串并修改字符串的函数,在我修改了我的库中的字符串后,修改后的值应该可以被C ++代码使用。这是我的功能(它不起作用),

C#界面,

Int32 testString([param: MarshalAs(UnmanagedType.LPStr)] ref string strData);

C#Implementation,

class Test:ITest
{
  public int testString(ref string strData)
       {

            strData = strData + strData;
            Console.WriteLine("strData in lib :"+strData);
            return 0;
        }
}

C ++代码(我错过了部分,注册了com lib,导入了tlb等),

ITest * mInterface = NULL;
//...initilizing interface , skipped since this parts has no problem
LPSTR tt = "OLA";
mInterface ->testString(&tt); //It crashes when comes here ..
cout << tt <<endl; 

1 个答案:

答案 0 :(得分:0)

我已经找到了解决我的问题的方法,我不确定但也许我们不能使用com interop从c ++到c#初始化对象。如果使用一个指向c#com的空指针,并在c#库代码中初始化该指针它有效你可以看到下面的样本;

c#library interface

int testString(out string val);

c#library imp

class Test
{
    int testString(out string val)
    {
        val = "Hello world"; //now user of this method can use val 
        return 0;
    }
}

c ++用法

#pragma warning (disable: 4278)

#import "../yourtlb.tlb" no_namespace named_guids
ITestInterface * fpInterface = NULL;
    int retval = 1;
    CoInitialize(NULL);

    HRESULT hr = CoCreateInstance(CLSID_Test ,
               NULL, CLSCTX_INPROC_SERVER,
               IID_ITestInterface, reinterpret_cast<void**>(&fpInterface));

    if(!FAILED(hr))
    {
        BSTR val = NULL;
        int ret = fpInterface->testString(val);
        cout <<val<<endl;
    }

当然在使用c ++中的代码之前,不要忘记从c#项目生成tlb文件,不要忘记编辑注册表文件。Here you can see a good sample