C++ C++;托管clr调用库don';在safearray参数中返回字符串
我有一个CSharp库: using System; namespace MyNetLib { public class Myclass { public int MyFunc(string strin, ref string strout) { strout = "Input string is: " + strout; return strin.Length; } } } 使用制度; 名称空间MyNetLib { 公共类Myclass { public int MyFunc(string strin,ref string strout) { strout=“输入字符串为:”+strout; 回纹长度; } } } 我运行下面的代码,但没有返回SafeArray参数中的输出字符串。由于没有错误迹象,有什么问题 #include <atlbase.h> #include <mscoree.h> #include <metahost.h> #pragma comment (lib, "mscoree.lib") #import <mscorlib.tlb> raw_interfaces_only high_property_prefixes ("_get", "_put", "_putref") rename ("ReportEvent", "StdReportEvent") rename ("_DSA", "_CLR_DSA") using namespace mscorlib; void main() { ICorRuntimeHost *pCorRuntimeHost = NULL; HRESULT hr = CorBindToRuntimeEx( L"v4.0.30319", L"srv", STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN | STARTUP_CONCURRENT_GC, CLSID_CorRuntimeHost, IID_PPV_ARGS( &pCorRuntimeHost ) ); pCorRuntimeHost->Start(); IUnknown *pUnkDomain = NULL; _AppDomain *pAppDomain = NULL; hr = pCorRuntimeHost-> GetDefaultDomain ((IUnknown **) &pUnkDomain); hr = pUnkDomain-> QueryInterface (__uuidof (_AppDomain), (void **) &pAppDomain); _Assembly *pAssembly = NULL; BSTR bstrAssemblyString = SysAllocString (L"MyNetLib"); hr = pAppDomain-> Load_2 (bstrAssemblyString, &pAssembly); SysFreeString (bstrAssemblyString); _Type *pType = NULL; BSTR typeString = SysAllocString (L"MyNetLib.Myclass"); VARIANT obj; hr = pAssembly-> GetType_2 (typeString, &pType); hr = pAssembly-> CreateInstance (typeString, &obj); SysFreeString (typeString); LONG index = 0; SAFEARRAY* safeArgs = NULL; SafeArrayAllocDescriptor(1, &safeArgs); safeArgs->cbElements = sizeof(VARIANT); safeArgs->rgsabound[0].lLbound = 0; safeArgs->rgsabound[0].cElements = 2; SafeArrayAllocData(safeArgs); VARIANT arg1; VariantInit(&arg1); V_BSTR(&arg1) = SysAllocString (L"String input."); V_VT(&arg1) = VT_BSTR; VARIANT arg2; BSTR pbstrOut = NULL; VariantInit(&arg2); V_BSTRREF(&arg2) = & pbstrOut; V_VT(&arg2) = VT_BSTR | VT_BYREF; VARIANT retVal; SafeArrayPutElement(safeArgs, &index, &arg1); index++; SafeArrayPutElement(safeArgs, &index, &arg2); BSTR methodString = SysAllocString (L"MyFunc"); hr = pType-> InvokeMember_3 (methodString, (BindingFlags) (BindingFlags_InvokeMethod | BindingFlags_Public | BindingFlags_Instance), NULL, obj, safeArgs, &retVal); } #包括 #包括 #包括 #pragma注释(lib,“mscoree.lib”) #导入原始接口\u仅高\u属性\u前缀(“\u get”、“\u put”、“\u putref”)重命名(“ReportEvent”、“StdReportEvent”)重命名(“\u DSA”、“\u CLR\u DSA”) 使用名称空间mscorlib; void main() { ICorRuntimeHost*pCorRuntimeHost=NULL; HRESULT hr=CorBindToRuntimeEx(L“v4.0.30319”,L“srv”,启动加载程序优化单域启动并发GC, CLSID_CorRuntimeHost、IID_PPV_ARGS(&pCorRuntimeHost)); pCorRuntimeHost->Start(); IUnknown*pUnkDomain=NULL; _AppDomain*pAppDomain=NULL; hr=pCorRuntimeHost->GetDefaultDomain((IUnknown**)和pUnkDomain); hr=pUnkDomain->QueryInterface(uuuIdof(uAppDomain),(void**)和pAppDomain); _Assembly*pAssembly=NULL; BSTR bstrAssemblyString=SysAllocString(L“MyNetLib”); hr=pappodomain->Load_2(bstrAssemblyString和pAssembly); SysFreeString(bstrAssemblyString); _Type*pType=NULL; BSTR typeString=SysAllocString(L“MyNetLib.Myclass”); 变异obj; hr=pAssembly->GetType_2(typeString和pType); hr=pAssembly->CreateInstance(typeString,&obj); SysFreeString(typeString); 长指数=0; SAFEARRAY*safeArgs=NULL; SafeArrayAllocDescriptor(1和safeArgs); safeArgs->cbElements=sizeof(变量); safeArgs->rgsabound[0]。lLbound=0; safeArgs->rgsabound[0]。cElements=2; SafeArrayAllocData(safeArgs); 变异体arg1; VariantInit(&arg1); V_BSTR(&arg1)=SysAllocString(L“字符串输入”); V_VT(&arg1)=VT_BSTR; 变异体arg2; BSTR pbstrOut=NULL; VariantInit(&arg2); V_bstref(&arg2)=&pbstrOut; V_VT(&arg2)=VT|BSTR | VT_BYREF; 变异检索; SafeArrayPutElement(safeArgs、索引和arg1); 索引++; SafeArrayPutElement(safeArgs、索引和arg2); BSTR methodString=SysAllocString(L“MyFunc”); hr=pType->InvokeMember_3(methodString,(BindingFlags)(BindingFlags_InvokeMethod | BindingFlags_Public | BindingFlags_Instance),NULL、obj、safeArgs和retVal; }C++ C++;托管clr调用库don';在safearray参数中返回字符串,c++,winapi,interop,clr,C++,Winapi,Interop,Clr,我有一个CSharp库: using System; namespace MyNetLib { public class Myclass { public int MyFunc(string strin, ref string strout) { strout = "Input string is: " + strout; return strin.Length; } } }
你能试试StringBuilder吗?将功能更改为:
public int MyFunc(string strin, ref StringBuilder strout)
{
strout.insert(0, strin);
return strin.Length;
}
由于字符串对象在.NET中是只读的,如果要更改字符串的内容,则应使用StringBuilder完全相同的问题。我认为您无法让它工作,它只是在调用后不会将object[]元素封送回SAFEARRAY。通常需要在参数上[In,Out]来说服封送处理程序花时间将它们复制回来,这是不存在的。解决方案是通过IntPtr返回字符串的函数。