我在尝试将一些代码从 java 移植到 c# 时遇到了一些麻烦。
首先,对java代码背后的关键概念进行一些解释: 现有代码的关键概念是在外部库中导入/使用方法的类。这个类实现了一个接口(interface),它声明了外部库中的大部分方法。好处是能够创建像
这样的实例Interface1 instance = new classImplementingInterface1();
我正在尝试移植实现接口(interface)并从外部库导入方法的代码。实际上,我必须将该接口(interface)转换为抽象类,因为 java 接口(interface)使用包含预定义值的字段,这在 .NET 接口(interface)中实际上是不支持的。
这可能是我的出发点:
public abstract class abstractClassA
{
public abstract int abstractMethodA(int parameter);
}
public class usualClass : abstractClassA
{
[DllImort("ExternalLib.dll")]
public static extern abstractMethodA(int parameter);
}
抽象类用于从实现该抽象类的类中创建实例,只需键入即可
abstractClassA instance = new usualClass();
好的,这就是我想做的,但我发现这行不通,虽然我继承了一个抽象类,但我必须对我想实现的方法使用覆盖语句
public class usualClass : abstractClassA
{
public extern override abstractMethodA(int parameter);
}
这不能与 DllImport 语句结合使用,因为它告诉我使用该语句的方法应同时声明:extern 和 static。添加 override 关键字来实现抽象类是不可能的,因为不能将静态成员声明为 override。所以我想我被困住了:/
但实际上我想创建一个类,命名来自外部库的入口点。但是我希望这个类实现一个接口(interface)/抽象类,以便能够通过键入来创建实现这个接口(interface)/抽象类的类的实例
abstractClassA instance = new usualClass();
我也尝试过使用接口(interface)(但没有烦人的静态预定义字段)来实现这些东西,我发现接口(interface)实现也不能与 DllImport 语句结合使用,编译器说命名方法是静态的,因此不能实现一个接口(interface)方法。这实际上是有道理的,但不是解决我的问题的合适方法。
您有这方面的经验或进一步的想法吗?
最佳答案
正如 C# 编译器所说,方法必须是static extern。幸运的是 DllImport 具有 EntryPoint 属性,它允许您在 C# 中使用不同的名称(从而避免命名冲突)。例如:
public abstract class AbstractClassA
{
public abstract int AbstractMethodA(int parameter);
}
public class UsualClass : AbstractClassA
{
[DllImport("ExternalLib.dll", EntryPoint = "abstractMethodA")]
static extern int AbstractMethodAImport(int parameter);
public override int AbstractMethodA(int parameter)
{
return AbstractMethodAImport(parameter);
}
}
但是,您的代码没有遵循最佳实践(另外让人恼火的是,这就是您在 Java 中命名事物的方式 - 但在罗马时是罗马人;请阅读 C# 命名约定 ).你真的应该按如下方式实现它:
public abstract class AbstractClassA
{
public abstract int AbstractMethodA(int parameter);
}
public class UsualClass : AbstractClassA
{
public override int AbstractMethodA(int parameter)
{
return NativeMethods.AbstractMethodA(parameter);
}
}
[SuppressUnmanagedCodeSecurity]
internal class NativeMethods
{
[DllImport("ExternalLib.dll", EntryPoint = "abstractMethodA")]
public static extern int AbstractMethodA(int parameter);
}
始终将您的 externs 放在一个类中,您应该调用 NativeMethods。
关于C#:将 DllImport 与继承相结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820175/
我在开发的Rails3网站的一些搜索功能上遇到了一个小问题。我有一个简单的Post模型,如下所示:classPost我正在使用acts_as_taggable_on来更轻松地向我的帖子添加标签。当我有一个标记为“rails”的帖子并执行以下操作时,一切正常:@posts=Post.tagged_with("rails")问题是,我还想搜索帖子的标题。当我有一篇标题为“Helloworld”并标记为“rails”的帖子时,我希望能够通过搜索“hello”或“rails”来找到这篇帖子。因此,我希望标题列的LIKE语句与acts_as_taggable_on提供的tagged_with方法
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭9年前。我需要从基于ruby的应用程序使用AmazonSimpleNotificationService,但不知道从哪里开始。您对从哪里开始有什么建议吗?
所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass
我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
假设我有一个名为Flight的模块,其中包含类方法和实例方法。我可以使用include、extend或两者将其方法放入类中:classBatinclude会将Flight添加到Bat.ancestors,但extend不会。我的问题是,为什么模块与类不同?当我对Mammal进行子类化时,我总是同时获得类和实例方法。然而,当我混入一个模块时,我不能同时获得类和实例方法(除非我使用self.included钩子(Hook)或类似ActiveSupport::Concern的东西)。这种差异背后是否存在语言设计问题? 最佳答案 Modul