WinFormsコントロールを.NET UserControlでラップし、Microsoftで使用するCOMアセンブリとして使用できるようにするVB.NETプロジェクトがありますオフィス。プロジェクトはこれを行うための標準的なテクニックを使用します。つまり、プロジェクトプロパティで[Make Assembly COM-Visible]チェックボックスと[COM Interopに登録する]チェックボックスをオンにし、アセンブリに強い名前で署名します。レジストリ内のコンポーネント登録は以下の通りです:VB.NET UserControlのCOMバージョンをMicrosoft Officeの64ビット版で利用可能にする
<ComRegisterFunction()>
Public Shared Sub RegisterForCOM(ByVal aType As Type)
Dim strCtrlKey, strVersion As String
Dim typeLibGUID As Guid
strCtrlKey = "CLSID\" + aType.GUID.ToString("B")
Dim key As RegistryKey = Registry.ClassesRoot.OpenSubKey(strCtrlKey, True)
key.CreateSubKey("Control")
key.CreateSubKey("Implemented Categories\{40FC6ED4-2438-11CF-A3D8-080036F12502}")
key.CreateSubKey("MiscStatus").SetValue("", "131457")
typeLibGUID = Marshal.GetTypeLibGuidForAssembly(aType.Assembly)
key.CreateSubKey("TypeLib").SetValue("", typeLibGUID.ToString("B"))
Dim asmVersion As Version = aType.Assembly.GetName().Version
strVersion = asmVersion.Major.ToString() + "." + asmVersion.Minor.ToString()
key.CreateSubKey("Version").SetValue("", strVersion)
key.Close()
End Sub
<ComUnregisterFunction()>
Public Shared Sub UnregisterForCOM(ByVal aType As Type)
Try
Registry.ClassesRoot.DeleteSubKeyTree("CLSID\" + aType.GUID.ToString("B"))
Catch
End Try
End Sub
この構造は、当社の顧客は、Microsoft Officeの64ビット版では、この.NET COMラッパーを使用しようとした瞬間まで年間、何の問題もなく働いています。私はインターネットでこの質問に対する答えを見つけようとしましたが、WinFormsコントロール用に64ビット互換のCOMラッパーを実装する方法のガイドが見つかりませんでした。
それはまったく可能ですか?もしそうなら、正しい方向に向けることができますか?
更新:答えを見つけるために助けるため@HansPassantへ
regasm <full_path_to_dll> /tlb /codebase
これは問題ではありませんが、重要な情報は質問にはありません。ユーザーは、「COM Interopの登録」チェックボックスをクリックしていません。このコンポーネントがどのようにユーザーのマシンに登録されているか説明する必要があります。インストーラを作成した場合は、64ビットインストーラでなければなりません。 Regasm.exeを使用する場合は、64ビットバージョンを使用する必要があります。 –
@HansPassant、我々のユーザーはregasmを使用しています。私はちょうど質問にこのコマンドライン呼び出しを追加しました。 – TecMan
あなたのユーザーは、不完全なインストール手順から問題を把握するのに十分な知識を持っていますが、使用するRegasm.exeの4つのバージョンのどれが驚くべきものかわからないと思います。なぜあなたは自分でそれを試してみてください、あなたはすぐにそれが間違っているかを見るでしょう。 –