C#:结合DllImport与继承?
尝试将一些代码从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);
}
一个抽象类被用来仅仅通过输入来从实现该抽象类的类创建实例
abstractClassA instance = new usualClass();
好吧,这就是我想要做的,但我想到这不会工作,而我继承了一个抽象类,我将不得不使用覆盖语句我想实现的方法
public class usualClass : abstractClassA
{
public extern override abstractMethodA(int parameter);
}
这不会与DllImport语句结合使用,因为它告诉我使用该语句的方法应声明:extern和static。 添加override关键字来实现抽象类是不可能的,因为静态成员不能声明为override。 所以我想我被困了一些:/
但实际上我想创建一个从外部库中命名入口点的类。 但我希望这个类实现一个接口/抽象类,以便能够通过键入来创建实现此接口/抽象类的类的实例
abstractClassA instance = new usualClass();
我也尝试过使用一个接口(但没有恼人的静态预定义字段)这个东西,我发现接口实现也不能与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);
}
}
然而,你的代码并不遵循最佳实践(更多的宠物狗狗,是的,这就是你如何用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);
}
始终将您的extern保存在一个类中,您应该调用NativeMethods
。
你只需要添加一个额外的间接层。 您必须用C#方法覆盖abstractMethodA
,而C#方法又调用外部方法。
public abstract class abstractClassA
{
public abstract int abstractMethodA(int parameter);
}
public class usualClass : abstractClassA
{
[DllImort("ExternalLib.dll", EntryPoint="TheFunctionName")]
private static extern abstractMethodAextern(int parameter);
public override int abstractMethodA(int parameter)
{
return abstractMethodAextern(parameter);
}
}
链接地址: http://www.djcxy.com/p/39435.html
上一篇: C#: combine DllImport with inheritance?
下一篇: Why must an C# interface method implemented in a class be public?