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
オブジェクトの を取得しようとした行ではなく、オブジェクトをインスタンス化しようとした行です。Type
DLL が見つからない場合、取得している行がクラッシュすると思います。
これはパーミッションと関係があるのではないかと疑っていますが、それらに沿った私の調査は実りがありませんでした。QAer には必要な権限があるようです。
注: Windows のファイル アクセス許可に関しては、私は達人ではありません。