gpt4 book ai didi

c# - 松耦合 NativeMethods

转载 作者:行者123 更新时间:2023-11-30 16:27:09 26 4
gpt4 key购买 nike

我需要使用 C# 中的 native DLL。 DLL 公开了几种我可以通过 P/Invoke 访问的方法和几种类型。所有这些代码都在标准的 NativeMethods 类中。为了简单起见,它看起来像这样:

internal static class NativeMethods
{
[DllImport("Foo.dll", SetLastError = true)]
internal static extern ErrorCode Bar(ref Baz baz);

internal enum ErrorCode { None, Foo, Baz,... }

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal struct Baz
{
public int Foo;
public string Bar;
}
}

为了实现松散耦合,我需要提取一个接口(interface)并使用对 NativeMethods 的调用来实现它:

public interface IFoo
{
void Bar(ref Baz baz);
}

public class Foo : IFoo
{
public void Bar(ref Baz baz)
{
var errorCode = NativeMethods.Bar(baz);
if (errorCode != ErrorCode.None) throw new FooException(errorCode);
}
}

现在我可以在我的代码中使用 IFoo 作为依赖项并在测试中模拟它:

public class Component : IComponent
{
public Component(IFoo foo, IService service) { ... }
}

这里似乎有些不对劲。根据 FxCop,NativeMethods 必须是内部的。因此 IFoo(从 NativeMethods 中提取)也是内部的也是有意义的。但我不能只将它设为内部 b/c,它用于公共(public) ctor(应该保持公开)。所以:为了实现松散耦合,我必须更改组件的可见性,否则它会是内部的。你们怎么看这个?

另一个问题:组件的方法 public void DoSomehing(Bar bar) 使用了 NativeMethods.cs 中定义的 Bar。我也必须公开它才能起作用。这,或者创建一个新的 Bar 类来包装 NativeMethods+Bar。如果我采用公开方式,那么 NativeMethods 也会公开,而 FxCop 会提示“嵌套类型不应该可见”。如果我采用包装方式......好吧,我觉得为所有“本地类型”做这件事太费力了。哦,还有第三种方法:将类型从 NativeMethods 移开并公开。然后 FxCop 开始分析它们并找到所有在嵌套在 NativeMethods 中时隐藏的错误。我真的不知道这里最好的方法是什么...

最佳答案

公共(public)抽象类可能是您的 friend ,而不是接口(interface)。

这可以包括internal抽象方法(指的是内部类型),这实际上使得无法从程序集外部以正常方式子类化(但是InternalsVisibleTo会让你为测试创建了一个假的)。

基本上,界面还没有真正设计得像从组件方面考虑的那样。

这正是我在 Noda Time 中所做的对于 CalendarSystem - 它的 API 使用内部类型,但我想让它成为一个接口(interface)或抽象类。我在 blog post 中写过关于访问的奇怪之处您可能会觉得有趣。

关于c# - 松耦合 NativeMethods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8163575/

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