c ++ clr与ZeroC Ice 3.5.1

时间:2015-02-03 20:44:46

标签: c++-cli ice

我需要编译使用ZeroC&C的ICE和c ++ clr生成的现有消息库。

我已经有一段时间了,我没有运气。

我定义了一个非常简单的.ice消息文件。 在为此生成cpp和h文件后,我尝试将它们编译为.dll。 我的slice2cpp命令行参数是

C:\Program Files (x86)\ZeroC\Ice-3.5.1\bin\slice2cpp.exe --depend --dll-export=ENABLE_DLL -I"C:\Program Files (x86)\ZeroC\Ice-3.5.1\slice" -I".\.." --underscore  "E:\test\platform\platform\testMessage.ice"

这会生成一个testMessage.cpp和testMessage.h文件。 在尝试编译这些时,我收到错误:

Error   7   error LNK2028: unresolved token (0A00098D) "class IceUtil::Shared * __cdecl IceInternal::upCast(class IceInternal::ObjectFactoryManager *)" (?upCast@IceInternal@@$$FYAPEAVShared@IceUtil@@PEAVObjectFactoryManager@1@@Z) referenced in function "public: __cdecl IceInternal::Handle<class IceInternal::ObjectFactoryManager>::Handle<class IceInternal::ObjectFactoryManager>(class IceInternal::Handle<class IceInternal::ObjectFactoryManager> const &)" (??0?$Handle@VObjectFactoryManager@IceInternal@@@IceInternal@@$$FQEAA@AEBV01@@Z)   E:\test\platform\platform\testMessage.obj   platform

与Ice一样,我必须链接Iced.lib和IceUtild.lib文件。 我编译时没有预编译的头文件和/ clr选项(不是纯粹的clr或安全) 使用VS2013。 testMessage.ice文件的主体非常简单。

#ifndef _MESSAGE_ICE_
#define _MESSAGE_ICE_

module messaging {

class Message
{
    string clientId;
    string origin;
    string destination;
    string messageType;
    string suffix;
};

sequence<Message> MessageSeq;

class NonQueuedMsg extends messaging::Message {};

};

#endif

在没有CLR选项的情况下进行编译会导致成功。

我想这都是由于我对c ++ clr缺乏了解而造成的。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我的项目迁移到2013后,我遇到了同样的问题。

项目c ++与ice编译正常 但是带有冰的项目c ++ / cli没有链接。

我修复了ObjectFactoryManagerF.h中的链接问题:

#ifdef __cplusplus_cli
IceUtil::Shared* upCast(ObjectFactoryManager* p) { return (IceUtil::Shared*) p; };
#else
IceUtil::Shared* upCast(ObjectFactoryManager* );
#endif

答案 1 :(得分:0)

我在他们的论坛here上读到他们不支持它后,我停止尝试使C ++ / CLI和ICE生成的代码一起工作。 我做了什么..我在客户端使用C ++ / CLI创建了本机静态库。静态库完全封装了所有通信内容,并从C ++ / CLI部分引用。结果我得到了一个混合(C ++ / CLR)推荐规则程序集。它运行良好,我有更容易的便携式应用程序。