C# 在C++中定义一个结构,然后在C中适当地定义MalSalas.() 我有一个C++的COM服务器,用数据填充C调用方的结构。 结构在C++ IDL中定义,如下所示: interface Icontrol : IDispatch{ [ uuid(...), version(1.0) ] typedef struct testStructure { int x; int y; int z; ... } testStructure; ... [id(9)] HRESULT getStruct([ref,in,out] testStructure * theData); ...

C# 在C++中定义一个结构,然后在C中适当地定义MalSalas.() 我有一个C++的COM服务器,用数据填充C调用方的结构。 结构在C++ IDL中定义,如下所示: interface Icontrol : IDispatch{ [ uuid(...), version(1.0) ] typedef struct testStructure { int x; int y; int z; ... } testStructure; ... [id(9)] HRESULT getStruct([ref,in,out] testStructure * theData); ...,c#,c++,struct,com-interop,idl,C#,C++,Struct,Com Interop,Idl,然后,在C代码中: EO_Lib.testStructure test = new EO_Lib.testStructure(); EO_Lib.getStruct(ref test); 我可以通过简单地在C结构中为非C本机字段使用MarshallAs,使其在常规的.DLL中工作没有问题。但我无法在COM.DLL上工作。我怀疑这是因为我对IDL缺乏了解 我需要能够做的是使用我用适当的MarshallAs信息创建的新C类型调用getStruct。我该怎么做 我使用VisualStudio 201

然后,在C代码中:

EO_Lib.testStructure test = new EO_Lib.testStructure();
EO_Lib.getStruct(ref test);
我可以通过简单地在C结构中为非C本机字段使用MarshallAs,使其在常规的.DLL中工作没有问题。但我无法在COM.DLL上工作。我怀疑这是因为我对IDL缺乏了解

我需要能够做的是使用我用适当的MarshallAs信息创建的新C类型调用getStruct。我该怎么做


我使用VisualStudio 2010 MFC/ATL C++和C.NET 4框架,如果它有帮助。

< P>而不是实际问题的解决方案,下面排除了我的问题的原因。 发件人:

从平台调用返回的结构必须是可blittable类型。平台调用不支持将不可blittable结构作为返回类型

所以基本上,你不能做我想做的事


如果您忽略COM方面,BrokenGlass的解决方案将回答将一个结构转换为另一个问题。

听起来您正试图从管理方面解决这个问题。不知道关于您的体系结构的很多细节,例如,这是您的COM服务器吗?我将不得不做出一些假设,以便提供从C++方面解决的任何解决方案,特别是MIDL IDL方面。p> 您提到了IDL,根据我所知,至少您可以访问生成类型库的IDL。所以,暂时忘掉CLR管理的方面,让它在未管理的COM环境中工作

完成后,确定托管客户端的结构外观。使用这些信息,在C++/MIDL项目中定义一个新类型。如果您的IDL没有ACF应用程序配置文件,请创建一个,它只是一个名称完全相同但扩展名为.ACF而不是.IDL的IDL文件。在ACF文件中,声明一个user\u封送处理类型,该类型将COM结构映射到刚刚定义的新托管友好结构。大概是这样的:

// ACF file

typedef [user_marshal(testStructure_ForDotNet)] testStructure;

// where testStructure is your "original" struct and "testStructure_ForDotNet" 
// is the one you just defined.
最后,您需要定义转换函数和封送函数。有关更多信息,请参阅此资源:

无论如何,希望这对任何人都有帮助