繁体   English   中英

c#第三方参考更新原因问题

[英]c# Third party Reference Update Cause Issues

我想知道您是否会帮助您。

我有一个用c#编写的应用程序,它使用来自IBM(cwbx)的引用。

我最初使用v5调用了该函数;

var download = new DatabaseDownloadRequest
                   {
                     system = host,
                     UseCompression = true
                     };

  download.AS400File.Name = tableNames;
  tempFileName = Path.GetTempFileName();
  fileDescriptionFile = Path.GetTempFileName();

  download.PCFile.Name = tempFileName;
  download.PCFile.FileType = delimiterType;

但是,IBM用他们的智慧将功能.PCFile更改为.pcFile,导致我的应用程序中断。

如果我公司中的所有用户都使用最新版本,这将不是问题,但是对此的吸收会很慢,因此我需要能够同时使用这两个版本。

是否可以在某种形式的函数中使用大写或小写形式使用我所需要使用的函数,以使它们相同,或者您能想到我可以采用的其他任何方式?

谢谢,

戴夫

我建议将这些调用包装到您创建的类中,该类使用反射访问它们。 我无法想象任何其他方法都会导致任何稳定的结果。

我认为在这里使用反射是最好的解决方案。

无论哪种版本的库都可以使用类似的方法:

PropertyInfo pcFileProperty = download.GetType().GetProperty("PCFile");

if (pcFileProperty == null)
{
    pcFileProperty = download.GetType().GetProperty("pcFile");
}

if (pcFileProperty != null)
{
    PCFileType file = (PCFileType)pcFileProperty.GetValue(download, null);
    file.Name = tempFileName;
    file.FileType = delimiterType;
}
else
{
    // Property not found - IBM has changed the API again?
    // Throw an exception?
}

这可能是一种回旋的方式,但是我已经尝试了一些虚拟类进行以下操作,并且似乎可行:

  • 创建两个包装程序项目,其中一个针对每个DLL版本构建。
  • 在您的主项目中,尝试通过相应的包装器项目调用该方法的新版本。 如果可行,那就太好了。 如果没有,您将在“找不到方法:DatabaseDownloadRequest.get_pcFile”的行中看到MissingMethodException。 捕获此异常并改用其他类!

如果设置正确,则可以使您的核心项目完全不必引用IBM程序集,并且在您的应用程序启动时只能检查一次异常,然后使所有内容正常运行。

为了澄清,我有五个项目:

  1. 提供我所需的接口的集合。
  2. 接口实现的集合-引用“新” DLL和(1)。
  3. 接口实现的另一个集合-引用“旧” DLL和(1.)。
  4. 一个工厂,它检查“新”实现中的异常,然后根据检查是否通过而仅返回“新”或“旧”实现-参考(1),(2)和(3)。
  5. 使用工厂的控制台应用程序-仅引用(1)和(4),不引用(2)或(3),更不用说“旧”或“新” DLL。

构建解决方案后,可以将“旧”或“新” DLL放到输出文件夹中,并且我的控制台应用程序将在下次运行时相应地做出响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM