0

VB6 で記述された COM クラスを利用する必要がある C# アプリケーションがあります。アプリケーションは、ユーザーが選択したバージョン (つまり、どの DLL) に基づいて異なるバージョンのコードを使用できる必要があるため、動的バインディングを使用する必要があります。プログラムがこれをサポートする方法は、最初にレジストリ内のすべてのバージョンを検出してから、ユーザーに選択させることです。

コードは私のマシンと私のピア レビュー担当者のマシンで動作しますが、品質保証 (QA) 担当者にとって、COM クラスを参照するコードがクラッシュします。

エラーを表示するメッセージ ボックスをコードに挿入すると、QAer は次のように表示します。 ここに画像の説明を入力

DLL が彼女のマシンに存在することを知っているので、「FILENOTFOUND」の部分が特にわかりにくいと思います。実際、彼女は、DLL の右クリックによる登録ユーティリティを使用して、自分のマシンに DLL を個人的に登録しました。これは私が使用したのと同じユーティリティです。

次に、クラッシュしている行を正確に見つけるために、さらに調査を行いました。問題のある行が呼び出された COM クラスをインスタンス化するコードを次に示します。

//Constructor for HtmlRtfConvProxy
public HtmlRtfConvProxy(String convWrapperProj) {
    convUtilType = Type.GetTypeFromProgID(convWrapperProj + "." + WRAPPER_CLASS_NAME);
    if(convUtilType == null) {
        throw new ArgumentException("Unable to find COM class");
    }
    //The following line is crashing for the person doing QA
    vbTargetObject = Activator.CreateInstance(convUtilType);
    if(vbTargetObject == null) {
        throw new ExternalException("Unable to instantiate COM class");
    }
}

さらに混乱したのは、どの行がクラッシュしているのかということでした。Typeオブジェクトの を取得しようとした行ではなく、オブジェクトをインスタンス化しようとした行です。TypeDLL が見つからない場合、取得している行がクラッシュすると思います。

これはパーミッションと関係があるのではないかと疑っていますが、それらに沿った私の調査は実りがありませんでした。QAer には必要な権限があるようです。

注: Windows のファイル アクセス許可に関しては、私は達人ではありません。

4

1 に答える 1

0

問題は、ターゲット DLL によって参照されたDLL の一部が、この問題が発生しているコンピューターで見つからないことでした。

于 2013-06-11T21:31:59.527 に答える