gpt4 book ai didi

C#:将 DllImport 与继承相结合?

转载 作者:可可西里 更新时间:2023-11-01 09:46:10 25 4
gpt4 key购买 nike

我在尝试将一些代码从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com