无法从 C++/CLI-dll 实现抽象类

本文关键字:CLI-dll 实现 抽象类 C++ | 更新日期: 2023-09-27 18:31:25

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 描述

无法从 C++/CLI-dll 实现抽象类

在看了你的C++/CLI类之后,我注意到你的ValueMessageBuilder是一个纯C++类,而不是一个C++/CLI类。

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

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

法典

这一行是错误的:

class ValueMessageBuilder : public Common::Logger

我认为它不能更改为.与 NET 兼容的类型,因为它适用于许多C++对象和类型。你得到的唯一机会是:在 C++/CLI -类型中实现此类,并通过另一个类或接口将其公开给C#

你不能。如果你使用像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。

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

重要提示,QuickFAST 中 .NET 支持的编码器端目前已禁用。这是由于编码器正在进行一些重大改进。一旦这些编码器更改稳定,就会重新启用 .NET 支持。如果 .NET 编码对你很重要,你可以通过赞助它来加快这项工作。

更多关于为什么要实施DNMessageBuilder? 如果您只需要自己的消息构建器,则应继承已经派生自Messages::ValueMessageBuilderImplBuilderBase