C# Can';t从C+实现抽象类+/CLI动态链接库
UPD我放置了VS2010解决方案。开始新的悬赏。我需要从.NET实现自己的ValueMessageBuilder。如果C++代码需要编写,那么我在寻找能告诉我该怎么做的人,以及如何与C? 我决定实现来自dll的抽象类,所以我编写了一些简单的代码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
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