c++ clr with ZeroC Ice 3.5.1



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

我已经在这里待了一段时间了,但我没有运气。

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

C:Program Files (x86)ZeroCIce-3.5.1binslice2cpp.exe --depend --dll-export=ENABLE_DLL -I"C:Program Files (x86)ZeroCIce-3.5.1slice" -I"..." --underscore  "E:testplatformplatformtestMessage.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:testplatformplatformtestMessage.obj   platform

像往常一样,我必须链接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 不熟悉造成的。任何帮助将不胜感激。

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

带有 ice 的项目 c++ 编译得很好但是带有 ICE 的项目 C++/CLI 没有链接。

我修复了对象工厂管理器F.h中的链接问题:

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

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

相关内容

  • 没有找到相关文章

最新更新