Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t从C+实现抽象类+/CLI动态链接库_C#_Visual Studio 2010_C++ Cli_Abstract Class_Fix Protocol - Fatal编程技术网

C# Can';t从C+实现抽象类+/CLI动态链接库

C# Can';t从C+实现抽象类+/CLI动态链接库,c#,visual-studio-2010,c++-cli,abstract-class,fix-protocol,C#,Visual Studio 2010,C++ Cli,Abstract Class,Fix Protocol,UPD我放置了VS2010解决方案。开始新的悬赏。我需要从.NET实现自己的ValueMessageBuilder。如果C++代码需要编写,那么我在寻找能告诉我该怎么做的人,以及如何与C? 我决定实现来自dll的抽象类,所以我编写了一些简单的代码 class MyMessageBuilder : DNMessageBuilder { } 由于DNMessageBuilder是抽象的,我在VS2010中单击了“实现成员”功能,代码更改为: class MyMessageBuilder : DNM

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


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

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


更多关于为什么要实现
DNMessageBuilder
?如果您只需要自己的消息生成器,则应继承已从
Messages::ValueMessageBuilder

派生的
ImplBuilderBase
,问题的主要根源可能与此相关(从其文档页):

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


更多关于为什么要实现
DNMessageBuilder
?如果你只想要你自己的消息生成器,你应该继承已经从
Messages::ValueMessageBuilder

派生出来的
ImplBuilderBase
,看看你的
C++/CLI
类之后,我注意到你的
ValueMessageBuilder
是一个纯
C++
-类而不是
C++/CLI应该是

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

看见

代码 这一行是错误的:

class ValueMessageBuilder : public Common::Logger
<>我不认为它可以变成.NET兼容类型,因为它和很多C++对象和类型一起工作。你唯一的机会是:
C++/CLI
-类型中实现这个类,并通过另一个类或接口将它公开给
C++/code>。

在查看了
C++/CLI
类之后,我注意到
ValueMessageBuilder
是一个纯粹的
C++
-类,而不是它应该是的
C++/CLI code>类

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

看见

代码 这一行是错误的:

class ValueMessageBuilder : public Common::Logger
<>我不认为它可以变成.NET兼容类型,因为它和很多C++对象和类型一起工作。你唯一的机会是:
C++/CLI
-类型中实现该类,并通过另一个类或接口将其公开给
C#

您不能。如果使用类似的反编译器检查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>;
    }
}
使用Microsoft.VisualC;
使用制度;
使用System.Runtime.CompilerServices;
使用System.Runtime.InteropServices;
名称空间QuickFAST.Messages
{
[DebugInfoInPDB,MiscellaneousBits(64),NativeCppClass]
[StructLayout(LayoutKind.Sequential,Size=8)]
内部静态结构ValueMessageBuilder
{

private long has)和根据,没有可见性修饰符的类/结构将被解释为内部。如果确实需要,可以添加修饰符,然后重新编译QuickFASTDotNet.dll。

不行。如果使用类似的反编译器检查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>;
    }
}
使用Microsoft.VisualC;
使用制度;
使用System.Runtime.CompilerServices;
使用System.Runtime.InteropServices;
名称空间QuickFAST.Messages
{
[DebugInfoInPDB,MiscellaneousBits(64),NativeCppClass]
[StructLayout(LayoutKind.Sequential,Size=8)]
内部静态结构ValueMessageBuilder
{

private long已经)并且根据,没有可见性修饰符的类/结构将被解释为内部。如果确实需要,可以添加修饰符,然后重新编译QuickFASTDotNet.dll。

听起来像ValueMessageBuilder被定义为
internal
,所以你运气不好。你必须在
publi的位置请求新的dllc
。这个问题的答案有用吗?您引用的DLL是否有依赖关系?如果有,您可能还需要引用它们才能访问ValueMessageBuilder@Smudge202QuoFrasdoTnET.DLL被添加到引用中。我猜想ValueMessageBuilder是在QuasFAST.DLL中定义的(可以从C++等中使用)。,但无法将QuickFAST.dll添加到VS引用、VS cla