Accessアプリケーション(MyAppと呼びます)が使用できるように、VB.NETで開発されたCOMコンポーネント(MyLibと呼びます)があります。そのためには、生成されたMyLib.dllファイルとMyLib.tlbファイルを使用してCOM登録を行う必要があります。両方のファイルをMyAppのフォルダーにインストールすると、すべてが正常に機能し、COM関数が正しく呼び出されます。ただし、dllを共通フォルダーにインストールすると、タイトルにエラーが表示されます。これを行う理由は、同じマシンに異なるバージョンのMyAppをインストールできるようにするためです。したがって、COMコンポーネントが変更されない場合は、もちろん、これらの異なるバージョン間でCOMコンポーネントを共有し、Windowsに参照カウントを実行させたいと考えています。
MyAppのインストールフォルダまたはMyLib.dllと同じ共通フォルダのどちらにMyLib.tlbファイルを配置する必要があるかわかりません。しかし、とにかく、私は両方の場所を試しました、そしてそれらはすべて同じエラーを出しました。MyLib。*をMyAppのフォルダーに入れた場合と、MyLib.dllを共通フォルダーに入れた場合のレジストリファイルを比較してみました。もちろん、HKCR \ Wow6432nodes \ CLSID {MYCLSID} \ InprocServer32で登録しようとしているクラスのCodeBaseを除いて、違いはわかりません。私が理解していないもう1つのことは、どちらの場合もHKCR \ Wow6432nodes \CLSID{MYCLSID}の下にTypeLibという名前のサブキーがないことです。
AccessアプリケーションでCOMリファレンスがどのように機能するか正確にはわかりません。間違っている場合は、訂正してください。誰かが私が間違ったことを教えてもらえますか?共有COMdllを登録する正しい方法は何ですか(dllとtlbの両方を共有フォルダーに入れるかどうかに関係なく)?ありがとう!
アップデート:
COM登録に関しては、WIXを使用してWindowsインストーラーを作成し、heat.exeを使用してdllファイルとtlbファイルから情報を収集しています。生成されたファイルには、Class、ProgID、TypeLib、およびRegistryタグの情報が含まれています。前述したように、WIX構成の観点から見ると、2つのケースの唯一の違いは、MyLib.dllファイルを配置する場所です(MyLib.tlbファイルをMyAppインストールフォルダーに配置するのが正しい方法だと思います。もう一度、修正してください。私が間違っている場合)、dllファイルとtlbファイルの両方をアプリケーションのインストールフォルダーに入れると、機能します。登録後のレジストリ構造は次のとおりです
まず、HKCR \ CLSID \ {MYCLSIDs}があり、それぞれが私のCOMクラスの1つを表しています。「InprocServer32」という名前のサブキーには、Assembly、Class、CodeBase、RuntimeVersion、threadingModelがあります。また、CodeBaseは、共通のファイルフォルダー(機能していない)またはMyAppのインストールフォルダー(機能している)のいずれかです。これは、dllを配置するさまざまな場所です。AccessはTypeLibのみを認識し、TypeLibから実際のdllへのリンクがあるはずなので、{MYCLSIDs}の下に別のサブキーTypeLibがあると思いましたが、どちらの場合もこのサブキーはありませんが、 2番目のケースはまだ機能しています。問題はありますか?
次に、HKLM \ Software \ Classes \ CLSID \ {MYCLSIDs}があります。このキーは、上記と同じ構造です。
第三に、HKCR \ {MYPROGIDs}、これらは私のクラスの単なるProgIDです
第4に、HKCR \ Typelib \ {LibID}には、tlbファイルからの情報が含まれています。このIDは、COMコンポーネントプロジェクトのアセンブリGUIDからのものです。
最後に、HKEY_CLASSES_ROOT \ Interface \ {InterfaceID}には、値{00020424-0000-0000-C000-000000000046}のProxyStubClsid32という名前のサブキーがあり、TypeLibという名前のサブキーと値は私のLibIDです。
唯一の違いは最初の項目のCodeBaseであるようです(私は間違っている可能性がありますが、それが私が見ているものです)。問題が発生した場合はお知らせください。ありがとう!
2回目の更新:
MyLib.dllを共有フォルダーにインストールした後、COM呼び出しが失敗します。しかし、SHARED_FOLDER\MyLib.dllのすべてのCodeBase値をINSTALLDIR\MyLib.dllに置き換え、MyLib.dllをINSTALLDIRにコピーすると、実際に機能します。逆に、MyLib.dllをINSTALLDIRにインストールした後(この場合はCOMが機能しています)、CodeBaseの値をINSTALLDIR\MyLib.dllからSHARED_FOLDER\MyLib.dllに変更し、SHARED_FOLDERにコピーします。今回は失敗します。ですから、それはまさに設置場所の問題であるように思われます。これは、私のCOMの理解とは正反対です。また、SHARED_FOLDERはインストーラーが作成するフォルダーにあるため、アクセス許可の問題はないと思います(間違っている可能性があります)。