首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据用户安装的软件使用供应商DLL的正确版本

根据用户安装的软件使用供应商DLL的正确版本
EN

Stack Overflow用户
提问于 2014-11-05 23:32:21
回答 1查看 220关注 0票数 1

尝试使用供应商程序集的正确版本,这取决于在用户的计算机上安装了哪个版本的供应商软件。这个问题非常相似,但给出的建议似乎行不通:

如何在一个项目中使用两个不同的Microsoft程序集?

关键是我需要实例化名称空间和类的特定版本,这取决于用户机器的情况。我不想将这两个程序集用于不同的目的;只是一个正确的程序集。使用WordPerfect及其API的一些实际代码,PerfectScript:

这是简单的设置,只使用WPx4 dll。

代码语言:javascript
复制
using WordPerfect;

namespace WP_PS_Tools {

public class WP_PerfectScript {
    public PerfectScript perfectScript { get; set; }
    public IntPtr _wpHandle { get; set; }

    /**
     * Initialize perfect script object
     */
    public WP_PerfectScript()
    {
        perfectScript = new PerfectScript();
    }
...

这里没问题。"WordPerfect“引用指向我从供应商的"wpwin14.tlb”创建的主互操作程序集。

但是,我的一些用户已经安装了WPx6,因此他们需要使用更新的WPx6 dll。这些dll非常相似,具有几乎相同的方法,并且共享相同的类名,并且可以共享相同的命名空间(取决于我如何创建主互操作程序集)。

我第一次尝试使用这个问题所尝试的路径:允许同一个COM库的多个版本,对于它,微软对如何修改程序集以包含两个版本的如何:包装多个版本的类型库进行了非常神秘和未完成的描述:如何:包装多个版本的类型库。我也想不出如何将另一个程序集添加到现有的程序集中,而且我也不相信这实际上会有所帮助。

下一个徒劳无功的尝试是试图以某种方式抽象类,以便根据特定的安装情况调用其中一个或另一个:

代码语言:javascript
复制
using Corel.WordPerfect14;

namespace WP_PS_Tools {

public class WP14_PerfectScript {
    public virtual PerfectScript perfectScript { get; set; }
    public IntPtr _wpHandle { get; set; }

    /**
     * Initialize perfect script object
     */
    public WP14_PerfectScript()
    {
        perfectScript = new PerfectScript();
    } 
.
.
.

using Corel.WordPerfect16;

namespace WP_PS_Tools
{
public class WP16_PerfectScript: WP14_PerfectScript
{
    public PerfectScript perfectScript { get; set; }


    public WP16_PerfectScript()
    {
        perfectScript = new PerfectScript();
    }
}
}

这甚至没有编译,因为主要的问题是:属性perfectScript必须转换为PerfectScript类型的一个或另一个版本(在本例中,类Corel.WordPerfect14.PerfectScript或Corel.WordPerfect16.PerfectScript)。按预期插入“新”:我获得了运行完美的WPx4 dll版本(但无法与已经运行的WPx6程序进行交互)。据我所知,没有比PerfectScript类本身更抽象的类型了,所以我不能使用该类继承。

我还尝试将这两个程序集命名为完全相同的程序集,但Visual不允许我使用相同的名称引用它们。然后,我尝试使用相同的名称创建程序集,然后重命名文件名。我被允许添加它们作为引用,但最终导致类名的模糊性-其他问题也提到了。

接下来,我尝试使用extern别名关键字,但最终出现了相同类型的强制转换问题。

这个问题必须有一个简单的答案!如果属性中的“虚拟”意味着您可以覆盖该类型,那当然是好的,但是唉,事实并非如此。

我想我可能只需要用不同的引用编译我的应用程序的两个版本,但是这个解决方案并不理想。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-10 20:44:37

如果我正确理解,您希望通过安装在计算机上的PerfectScript版本运行WordPerfect命令,但您不需要编译/安装/维护多个版本的软件。

我对这个问题的解决方案是为我维护的软件实现一个插件系统。网络上有多个资源,对我来说最有用的是工厂模式的这个实现。

  1. 定义要运行脚本的抽象类接口。这个类存在于您的应用程序中,并且与不同版本的WordPerfect无关。这个类需要驻留在应用程序链接所针对的DLL中,因为它将在将要创建的插件之间共享。
  2. 为您支持的每个版本的WordPerfect实现抽象类。将每个实现放入自己的DLL中。因此,每个DLL只关注特定版本的WordPerfect。
  3. 使用WordPerfect (String)在运行时加载客户端机器上安装的匹配System.Reflection.Assembly.Load的dll
  4. 迭代程序集中的类型,找到实现抽象类的类型,获得一个ConstructorInfo并调用该类型。

这里的最终目标是使用.NET的反射能力在运行时构造一个非常特定的类。您并不真正关心这个类的具体细节,只是它实现了您的抽象类,为它提供了一个公共接口,您可以使用您支持的WordPerfect版本。

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26769159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档