1

我想知道你是否愿意帮忙。

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

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

是否有任何类型的函数可以使我需要使用的函数大写或小写以使其相同,或者您能想到其他任何方法吗?

谢谢,

戴夫

4

3 回答 3

1

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

于 2012-11-13T12:30:58.387 回答
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?
}
于 2012-11-13T12:48:17.530 回答
0

这可能是一种迂回的方式,但我已经用一些虚拟类尝试了以下方法,它似乎有效:

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

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

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

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

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

于 2012-11-13T12:56:44.513 回答