【发布时间】:2016-08-15 19:05:46
【问题描述】:
我正在尝试从 C++ 调用 C# 代码。所以我选择了COM Interop方式。现在我有了 C# 代码:
namespace ToBeCalled
{
[Guid("9329feaf-b293-4093-a7d8-6128f52b30a6")]
[ComVisible(true)]
public interface IInterface
{
int Write(string toWrite);
}
}
namespace ToBeCalled
{
[Guid("e4105e40-2d6b-4b7c-ae42-d2f9c405a2a0")]
[ComVisible(true)]
public class ClassYouWantToUse : IInterface
{
public int Write(string toWrite)
{
System.Console.WriteLine(toWrite);
return 1;
}
}
}
还有c++代码
#import "...\\ToBeCalled.tlb"
int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// Create the interface pointer.
ToBeCalled::IInterfacePtr piTest(__uuidof(ToBeCalled::ClassYouWantToUse));
long lResult = 0;
// Call the Add method.
piTest->Write("hi", &lResult);
wprintf(L"The result is %d\n", lResult);
// Uninitialize COM.
CoUninitialize();
return 0;
}
当我尝试这个编译时,当然它说 Write 不需要 2 个参数。我看到了 MSDN,他们有这样的例子,他们以这种方式获取返回值。所以我的问题是,我怎样才能获得函数的返回值?当我将调用更新为
piTest->Write("hi");
在未处理的异常上执行失败。当我尝试这个没有返回值的例子时,方法的返回值声明是无效的,然后一切正常。
【问题讨论】:
-
我发现需要在c#中添加参数,然后我可以使用第二个参数来获得结果值。好的,所以对于 Int 问题解决了,但是我怎样才能发送这样的字符串呢?
-
您应该能够正常返回一个值,而不是通过
[out]参数。究竟是什么异常?您是否调试过托管调用?
标签: c# c++ com unmanaged managed