我想知道你是否会帮忙。
我有一个用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,导致我的应用程序崩溃。
如果我公司内的所有用户都使用最新版本,这不会是一个问题,但是这个问题会很慢,所以我需要能够同时使用这两个版本。
是否有任何类型的功能,我可以大写或小写我需要使用的功能,以便它可以相同,或者你能想到我能做到的任何其他方式吗?
谢谢,
戴夫
答案 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)
这可能是一种迂回的方式,但我尝试了以下一些虚拟类,它似乎工作:
如果你设置正确,你可以让你的核心项目根本不必引用IBM程序集,并且当你的应用程序启动时,你将能够只检查一次的异常,此后一切都正常运行。
澄清一下,我有五个项目:
一旦我构建了解决方案,我就可以将“旧”或“新”DLL放入我的输出文件夹中,我的控制台应用程序将在下次运行时相应地响应。