1

あなたが助けてくれるかどうか疑問に思っていました。

IBM (cwbx) からの参照を使用する c# で記述されたアプリがあります。

もともと 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

これは回り道かもしれませんが、いくつかのダミークラスで次のことを試してみましたが、うまくいくようです:

  • 2 つのラッパー プロジェクトを作成します。1 つは DLL の各バージョンに対してビルドされます。
  • メイン プロジェクトで、対応するラッパー プロジェクトを介して新しいバージョンのメソッドを呼び出してみてください。それが機能する場合、素晴らしいです。そうでない場合は、「メソッドが見つかりません: DatabaseDownloadRequest.get_pcFile」の行に沿って MissingMethodException が発生します。この例外をキャッチして、代わりに他のクラスを使用してください!

これを正しく設定すると、コア プロジェクトが IBM アセンブリをまったく参照する必要がなくなり、アプリケーションの起動時に1 回だけ例外をチェックすることができ、その後はすべて正常に実行されます。

明確にするために、私には 5 つのプロジェクトがあります。

  1. 必要なものを提供するインターフェイスのコレクション。
  2. インターフェイス実装のコレクション - 「新しい」DLL および (1) を参照します。
  3. インターフェイス実装の別のコレクション - 「古い」DLL および (1.) を参照します。
  4. 「新しい」実装で例外をチェックし、その後、チェックに合格したかどうかに応じて「新しい」または「古い」実装のみを返すファクトリ - 参照 (1)、(2)、および (3)。
  5. ファクトリを使用するコンソール アプリケーション - (1) と (4) のみを参照し、(2) または (3) は参照せず、「古い」または「新しい」DLL は言うまでもありません。

ソリューションを構築したら、「古い」または「新しい」DLL を出力フォルダーにドロップできます。コンソール アプリは、次に実行したときにそれに応じて応答します。

于 2012-11-13T12:56:44.513 に答える