

お世話になります。

ExcelのVBAから、C#で作成したCOMライブラリを使用したく、  
先ず、C#のコードを以下の様にしました。  
（VS2019を管理者権限にて起動し、新規プロジェクトより、C#-クラスライブラリ(.netframework 4.8)にて、AAA.csとして実装）

[code]

    using System;
    using System.Runtime.InteropServices;
    
    namespace clsLibZZZ
    {
        [Guid("xxxxxxxx-xxxx ...xxxx")] - (1)
        [ComVisible(true)]
        public interface IAAA
        {
            //
        }
    
        [Guid("xxxxxxxx-xxxx ...xxxx")] - (2)
        [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface IAAAEvents
        {
            //
        }
    
        [Guid("xxxxxxxx-xxxx ...xxxx")] - (3)
        [ClassInterface(ClassInterfaceType.None)]
        [ComSourceInterfaces(typeof(IAAAEvents))]
        public class AAA : IAAA
        {
            public AAA()
            {
                //
            }
            ~AAA()
            {
                //
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
    
        }
    }
    
[/code]

※ (1)(2)(3)はそれぞれ違うGUID値をVS2019のツール「GUIDの作成」からコピー／貼り付けしております。

プロジェクトのプロパティにて、  
・「アセンブリをCOM参照可能にする」にチェックを入れ、  
・「COM相互運用機能の登録」にチェックを入れ、

ビルドの構成マネージャーにて、  
・プラットフォームを x64 に設定  
し、コンパイルしました。

Debug/Releaseフォルダとも、  
・clsLibZZZ.dll  
・clsLibZZZ.tlb  
が出来る事を確認しております。

Excel(Excel365 64bit)を起動し、「開発」タブのVisualBasicを開き、  
「参照設定」にて、(上記で作成された)"clsLibZZZ.tlb"を追加します。  
（特に問題は起こらず、clsLibZZZにチェックが付きます）

VBAProjectを右クリックして、「挿入」→「クラスモジュール」を追加します。

[code]

    Option Explicit
    
    Public WithEvents XYZ As clsLibZZZ.AAA
    
    Private Sub Class_Initialize()
    
        Set XYZ = New AAA
    
    End Sub
    
    Private Sub Class_Terminate()
    
        Set XYZ = Nothing
    
    End Sub
    
[/code]

次に、VBAProjectを右クリックして、「挿入」→「標準モジュール」を追加します。

[code]

    Option Explicit
    
    Private cls1 As Class1
    
    Public Sub InitClass()
    
        Set cls1 = New Class1
    
    End Sub
    
    Public Sub ReleaseClass()
    
        Set cls1 = Nothing
    
    End Sub
    
[/code]

適当なファイル名を付けて、Excelマクロ(xlsm)を保存し、VisualBasicの画面を閉じます。

Excelのシートの画面に戻ったら、「開発」タブの「マクロ」から InitClass を実行します。  
そのまま、 **5分ほど放置** します。  
その後、「開発」タブの「マクロ」から ReleaseClass を実行します。  
Excelを右上の[×]にて、終了します。

しばらく待つと、Excelが「Book1」として、再起動してしまいます。  
但し、「5分待つ」を「10秒待つ」だとExcelの再起動はありません。

【動作確認環境】

Windows10 Pro(64bit) + Excel365(Office365) 64bit  
Windows11 Pro(64bit) + Excel2019 64bit

この現象について、色々と調べてみましたが、Excelが再起動する原因と解消する方法が分かりませんでした。  
何か分かる方がご教授を頂きたく、よろしくお願いいたします。

追伸

何故「空」なのか？を問う方も居られるかと思います。  
当初はC#で通信プログラムを組み、COMライブラリとする事で、VBAから扱う事を目的としていました。  
この通信プログラムとのやりとりには問題が無かったものの、しばらく通信ログを取り、Excelを終了した後に再起動が確認されました。  
リソースの解放不足かと思ったのですが。色々とやっている内に「空」でも発生する事が分かった次第です。  


CC BY-SA 4.0
2023-05-23T14:18:22.547
94947
2023-05-23T18:05:08.317
52988
question
c# vba excel com
空のCOMクラスライブラリ（C#）を、VBAから初期化してから解放すると、Excelが再起動する（短時間では再起動しない）