尝试使用供应商程序集的正确版本,这取决于在用户的计算机上安装了哪个版本的供应商软件。这个问题非常相似,但给出的建议似乎行不通:
关键是我需要实例化名称空间和类的特定版本,这取决于用户机器的情况。我不想将这两个程序集用于不同的目的;只是一个正确的程序集。使用WordPerfect及其API的一些实际代码,PerfectScript:
这是简单的设置,只使用WPx4 dll。
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库的多个版本,对于它,微软对如何修改程序集以包含两个版本的如何:包装多个版本的类型库进行了非常神秘和未完成的描述:如何:包装多个版本的类型库。我也想不出如何将另一个程序集添加到现有的程序集中,而且我也不相信这实际上会有所帮助。
下一个徒劳无功的尝试是试图以某种方式抽象类,以便根据特定的安装情况调用其中一个或另一个:
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别名关键字,但最终出现了相同类型的强制转换问题。
这个问题必须有一个简单的答案!如果属性中的“虚拟”意味着您可以覆盖该类型,那当然是好的,但是唉,事实并非如此。
我想我可能只需要用不同的引用编译我的应用程序的两个版本,但是这个解决方案并不理想。
发布于 2014-11-10 20:44:37
如果我正确理解,您希望通过安装在计算机上的PerfectScript版本运行WordPerfect命令,但您不需要编译/安装/维护多个版本的软件。
我对这个问题的解决方案是为我维护的软件实现一个插件系统。网络上有多个资源,对我来说最有用的是工厂模式的这个实现。
这里的最终目标是使用.NET的反射能力在运行时构造一个非常特定的类。您并不真正关心这个类的具体细节,只是它实现了您的抽象类,为它提供了一个公共接口,您可以使用您支持的WordPerfect版本。
希望这能有所帮助!
https://stackoverflow.com/questions/26769159
复制相似问题