inv*_*nva 2 .net c# windows winapi visual-studio-2010
在尝试将一些代码从java移植到c#时,我遇到了一些麻烦.
首先,对java代码背后的关键概念进行一些解释:现有代码的关键概念是在外部库中导入/使用方法的类.该类实现了一个接口,该接口声明了外部库中的大多数方法.好处是能够创建像这样的实例
Interface1 instance = new classImplementingInterface1();
我正在尝试移植实现接口的代码并从外部库导入方法.实际上我必须将该接口转换为抽象类,因为java接口使用包含预定义值的字段,这在.NET接口中是不受支持的.
这可能是我的注意点:
public abstract class abstractClassA
{
public abstract int abstractMethodA(int parameter);
}
public class usualClass : abstractClassA
{
[DllImort("ExternalLib.dll")]
public static extern abstractMethodA(int parameter);
}
Run Code Online (Sandbox Code Playgroud)
抽象类用于通过键入能够从实现该抽象类的类创建实例
abstractClassA instance = new usualClass();
Run Code Online (Sandbox Code Playgroud)
好吧,这就是我想要做的,但我发现这不起作用,而我继承了一个抽象类,我将不得不使用override语句来实现我想要实现的方法
public class usualClass : abstractClassA
{
public extern override abstractMethodA(int parameter);
}
Run Code Online (Sandbox Code Playgroud)
这不会与DllImport语句结合使用,因为它告诉我使用该语句的方法应声明两者:extern和static.添加override关键字以实现抽象类是不可能的,因为静态成员不能声明为override.所以我想我是如何处理的:/
但实际上我想创建一个类来命名外部库的入口点.但我希望这个类实现一个接口/抽象类,以便能够通过键入来创建实现此接口/抽象类的类的实例
abstractClassA instance = new usualClass();
Run Code Online (Sandbox Code Playgroud)
我也尝试使用接口(但没有烦人的静态预定义字段),我发现接口实现也不能与DllImport语句结合使用,编译器说命名方法是静态的,因此无法实现接口方法.这实际上是有道理的,但对我的问题没有可解决的解决方案.
您是否有过这方面的经验或更好的想法?
正如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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,你的代码并没有遵循最佳实践(更多的是,这就是你用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);
}
Run Code Online (Sandbox Code Playgroud)
总是把你的外出留在一个班级,你应该打电话NativeMethods.
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |