如何在C#中结合接口使用DllImport特性?
关于C#接口与DllImport结合的问题
首先明确:你原本的接口写法是不可行的,原因有两点:
- C#接口中不能定义静态成员,
internal static extern void Func();这种写法违反语法规则——接口成员默认是公共实例成员,不允许使用static修饰。 - 即使去掉
static,接口也无法直接包含extern方法的声明,因为接口只定义契约,不包含具体实现(包括外部DLL的导入实现)。
要实现你想要的“统一调用不同DLL中同名方法”的效果,可以调整接口的设计,让接口定义实例方法,再让子类在实例方法中调用各自导入的静态外部方法。修改后的代码示例如下:
public interface IIntDll { void Func(); } public class TestDll1 : IIntDll { [DllImport("Dll1.dll", CallingConvention = CallingConvention.StdCall)] private static extern void Func(); public void Func() { Func(); // 调用导入的静态外部方法 } } public class TestDll2 : IIntDll { [DllImport("Dll2.dll", CallingConvention = CallingConvention.StdCall)] private static extern void Func(); public void Func() { Func(); // 调用导入的静态外部方法 } } public class Test { public Test() { IIntDll intDll1 = new TestDll1(); intDll1.Func(); IIntDll intDll2 = new TestDll2(); intDll2.Func(); } }
关于抽象类的方案
抽象类是可行的,你可以在抽象类中定义抽象实例方法,让子类实现并调用各自的DllImport方法;也可以在抽象类中定义静态的DllImport占位,但更合理的写法还是和接口方案类似,用抽象方法约束子类,子类实现时绑定对应的外部DLL:
public abstract class AbstractDll { public abstract void Func(); } public class TestDll1 : AbstractDll { [DllImport("Dll1.dll", CallingConvention = CallingConvention.StdCall)] private static extern void Func(); public override void Func() { Func(); } } public class TestDll2 : AbstractDll { [DllImport("Dll2.dll", CallingConvention = CallingConvention.StdCall)] private static extern void Func(); public override void Func() { Func(); } } // Test类的调用逻辑和之前一致 public class Test { public Test() { AbstractDll dll1 = new TestDll1(); dll1.Func(); AbstractDll dll2 = new TestDll2(); dll2.Func(); } }
总结:接口不能直接和DllImport结合定义静态外部方法,但可以通过“接口定义实例契约+子类实现时调用导入方法”的方式达成需求;抽象类同样可行,实现逻辑和接口方案类似,两者都能满足你统一调用不同DLL方法的目的。
内容的提问来源于stack exchange,提问作者defa0009
相关产品推荐
相关产品推荐

