【问题标题】:.NET Client supporting multiple versions of an unmanaged DLL.NET 客户端支持多个版本的非托管 DLL
【发布时间】:2011-03-28 13:24:17
【问题描述】:

我正在开发一个 .NET 4.0 客户端,它将利用 C 库进行数据处理。用户将能够指定他们希望加载以进行处理的 DLL 文件。

我正在按照此处所述进行后期绑定/程序集加载。 http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

对于每个 DLL,相同的方法调用序列在我的客户端中是相同的,但方法签名会改变或传入的数据结构会改变。使用结构填充的数据将根据 DLL 的版本和其他因素而有所不同。例如,MyStruct 的定义会根据 DLL 的版本而改变。

public delegate int INTF_my_method(ref MyStruct pDataStruct);

针对这种方法推荐了哪些设计模式或设计决策?我需要根据用户指定的 DLL 版本加载适当的 C 方法委托和数据定义,并适当地填充结构。有没有人做过这样的事情?

【问题讨论】:

    标签: c# .net unmanaged dll


    【解决方案1】:

    在托管代码和本机代码中都没有干净的方法。您可能做的最好的事情是声明一个接口类型,尝试覆盖所有可能的版本,然后为每个单独的 API 版本编写具体的包装类。如果至少有一些通用功能,那么您可以将其放入基类中。

    值得注意的是,您不能只让用户选择一个 DLL,您必须将 DLL 与具体的包装类实例配对。

    在您的程序中构建这种灵活性显然是非常昂贵的。

    【讨论】:

      【解决方案2】:

      您可以加载不同版本的 DLL,但只能从单独的 AppDomain 加载。也就是说,对于您要加载的每个 DLL,您都必须创建一个新的 AppDomain。

      【讨论】:

      • 如果我想一次只加载 1 个,我想我可以只使用 1 个 App Domain。这是真的吗?
      • 是的,没错,但无论哪种情况,你仍然会遇到 Hans 上面描述的问题,你需要一些灵活的包装类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多