1

UPD我在这里放置了 VS2010 解决方案。开始新的赏金。我需要从 .NET 实现自己的 ValueMessageBuilder。如果需要编写 C++ 代码,那么我正在寻找可以向我展示如何做到这一点以及如何将其与 C# 链接的人

我决定实现来自dll的抽象类,所以我写了一些琐碎的代码

class MyMessageBuilder : DNMessageBuilder
{
}

作为DNMessageBuilder抽象,我在 VS2010 中单击了“实现成员”功能,并将代码更改为:

class MyMessageBuilder : DNMessageBuilder
{
    public override ValueMessageBuilder* builder()
    {
        throw new System.NotImplementedException();
    }
}

但是我有编译错误:

指针和固定大小的缓冲区只能在不安全的上下文中使用

“QuickFAST.Messages.ValueMessageBuilder”因其保护级别而无法访问

可访问性不一致:返回类型“QuickFAST.Messages.ValueMessageBuilder*”比方法“Myproj.Fast.MyMessageBuilder.builder()”更难访问

无法在此处访问内部结构“ValueMessageBuilder”。

我应该如何实现抽象类DNMessageBuilder,我该如何解决我的问题?我需要提供自定义(由我编写)ValueMessageBuilder

ValueMessageBuilder.h 如果这很重要。

我要实现的抽象类的实现

ValueMessageBuilder 描述

4

3 回答 3

2

在看了你的C++/CLI课后,我注意到你ValueMessageBuilder是一个纯课,C++而不是C++/CLI它应该是的课。

因此这可能是一个实现问题,似乎该类是抽象的,但只能在使用时被覆盖,C++/CLI而不是C#因为它不支持C++-only 类型。

http://www.codeproject.com/Articles/17741/C-CLI-in-Action-Declaring-CLR-types

代码

这一行是错误的:

class ValueMessageBuilder : public Common::Logger

我不认为它可以更改为与 .NET 兼容的类型,因为它可以处理大量 C++ 对象和类型。你得到的唯一机会是:在一个C++/CLI-type 中实现这个类并C#通过另一个类或接口将其公开。

于 2012-04-24T07:53:03.840 回答
0

你不能。如果您使用 ILSpy 之类的反编译器检查 QuickFASTDotNet.dll 您会发现它ValueMessageBuilder是内部的。事实上,ILSpy 显示了这段代码:

using Microsoft.VisualC;
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace QuickFAST.Messages
{
    [DebugInfoInPDB, MiscellaneousBits(64), NativeCppClass]
    [StructLayout(LayoutKind.Sequential, Size = 8)]
    internal static struct ValueMessageBuilder
    {
        private long <alignment member>;
    }
}

我不喜欢 C++,但检查 ValueMessageBuilder.h 我看到 ValueMessageBuilder 没有公共修饰符(例如,DNMessageBuilder有),根据这个家伙,没有可见性修饰符的类/结构将被解释为内部。如果确实需要,可以添加修饰符,然后重新编译 QuickFASTDotNet.dll。

于 2012-05-05T03:04:21.790 回答
-1

问题的主要根源可能与此有关(来自他们的文档页面):

重要注意事项 QuickFAST 中 .NET 支持的编码器端目前已禁用。这是由于在编码器中进行了一些重大改进。一旦这些编码器更改稳定,将重新启用 .NET 支持。如果 .NET 编码对您很重要,您可以通过赞助来加速这项工作。

更何况你为什么要实施DNMessageBuilder?如果您只想要自己的消息构建器,您应该继承ImplBuilderBase已经从Messages::ValueMessageBuilder.

于 2012-04-19T11:28:08.230 回答