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++

見る

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

コード

この行は間違っています:

class ValueMessageBuilder : public Common::Logger

多くのC++オブジェクトと型で動作するため、.NET互換型に変更できるとは思いません。取得できる唯一のチャンスは次のとおりです。このクラスを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 に答える