まず、.net COM dll と VBA とのやり取りには多くの問題があることがわかりました。
まず、属性を介して .net で構成するため、レジストリで正しく構成することが重要です。Dll プロジェクトが COM 相互運用に登録するようにマークされていることを確認します。
次に、MSI プロジェクトを使用している場合は、ソフトウェアが「すべてのユーザーをインストールする」とマークされていることを確認してください。MSI プロジェクトは、レジストリ エントリを削除するという非常に貧弱な作業を行うため、MSI インストールや .net バージョンなどを台無しにすると、サーバーは「不正なレジストリ エントリ」になってしまいます。コンポーネントを正しく登録するために regasm.exe を使用することになります。最終的に WIX プロジェクトのインストールに移行しました。
第 3 に、ターミナル サーバーの場合、レジストリ エントリが「マシン/グローバル」全体であることを確認する必要があります。これは、各ユーザーが実行する「レジストリ」エントリのセットが異なる可能性があるためです。名前空間を正しく設定していれば、リスクの高い遅延バインディングの "CreateObject" 呼び出しではなく、VBA で早期バインディングを実行できるはずです。起動時にVBAが「壊れた参照」をチェックすることを確認してください。
次に、非常にクリーンな VM を使用してインストールとレジストリ エントリをテストし、MS Office VBA リファレンスを使用して、COM パーツが正しく登録されていることを確認します。これにより、「CreateObject」呼び出しが失敗することはありません。
第 5 に、ターミナル サーバーと実行中の Office の明示的なバージョン (特に Office 2010 x64) に関する x86/x64 の問題に注意してください。サーバーが x64 の場合は、コンパイラ フラグ /86 を明示的に使用する必要がある場合があります (どの CPU も VBA .net COM オブジェクトに対して非常に悪い可能性があります)。
第 6 に、.net から COM に例外を発生させる方法に注意してください。正しいアプローチについては、System.Runtime.InteropServices.COMException をご覧ください。
From cmd
c:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727{or the edition your using}
COPY "\\Distribution Share\{YourCompany}\{Software}\{Edition}\{.net Com DLL name}.dll" "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll"
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /u
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /regfile:"C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg" /codebase
cd C:\WINDOWS\System32\
Regedit.exe /s "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg"
次に、生成されたレジストリ ファイルを詳しく調べて、正しいレジストリ ハイブにあることを確認します。