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

时间:2012-11-13 12:29:06

标签: c# reference

我想知道你是否会帮忙。

我有一个用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,导致我的应用程序崩溃。

如果我公司内的所有用户都使用最新版本,这不会是一个问题,但是这个问题会很慢,所以我需要能够同时使用这两个版本。

是否有任何类型的功能,我可以大写或小写我需要使用的功能,以便它可以相同,或者你能想到我能做到的任何其他方式吗?

谢谢,

戴夫

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

这样的东西应该适用于任何一个版本的库:

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?
}

答案 2 :(得分:0)

这可能是一种迂回的方式,但我尝试了以下一些虚拟类,它似乎工作:

  • 创建两个包装器项目,一个针对每个DLL版本构建。
  • 在您的主项目中,尝试通过相应的包装器项目调用该方法的新版本。如果它有效,那很好。如果没有,你将得到一个MissingMethodException,沿着“找不到方法:DatabaseDownloadRequest.get_pcFile”。抓住这个例外,改用另一个类!

如果你设置正确,你可以让你的核心项目根本不必引用IBM程序集,并且当你的应用程序启动时,你将能够只检查一次的异常,此后一切都正常运行。

澄清一下,我有五个项目:

  1. 提供我需要的接口集合。
  2. 接口实现的集合 - 引用“新”DLL和(1)。
  3. 另一个接口实现集合 - 引用“旧”DLL和(1。)。
  4. 一个工厂,它检查“新”实现中的异常,然后仅根据检查是否通过而引用“新”或“旧”实现 - 引用(1),(2)和(3)。 / LI>
  5. 使用工厂的控制台应用程序 - 仅引用(1)和(4),不引用(2)或(3)更不用说“旧”或“新”DLL。
  6. 一旦我构建了解决方案,我就可以将“旧”或“新”DLL放入我的输出文件夹中,我的控制台应用程序将在下次运行时相应地响应。