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?