COM相互運用の登録がグレーになってしまいます

タグの編集
投稿者 snowmansnow  (社会人) 投稿日時 2021/11/7 18:58:07

 こんばんは、るきお様、魔界の仮面弁士様、皆様
  しばらく体調不良、業務繁多でした。

  久しぶりにVisualStudio2019でクラスライブラリを作ろうと思ったのですが、
  コンパイルタブ下部の、COM相互運用の登録がグレーになってしまいます。
  ウィンドウズフォームアプリケーション(VB)で、
   アプリケーションタブのアプリケーションの種類をクラスライブラリにすると、
  コンパイルタブ下部の、COM相互運用の登録が従来は出来たのですが、
  ターゲットフレームワークがNET 5.0になった今は?、グレーのままです。
 
  他のWEBで、クラスライブラリ(VB)で作れば、選択できる⇒できたという記事があったのですが、
  私の環境では、それもダメでした。Microsoft Visual Studio Community 2019 Version 16.11.5

  過去のクラスライブラリを開いてみると、それは、COM相互運用の登録が出来ていて、
  ターゲットフレームワークがNET 4.7でした。

  何が原因で、どうすればクラスライブラリを従来のように、
  各種アプリ(コンソールとかフォームアプリとか、クラスライブラリとか)から
  クラスライブラリが出来るようになるのでしょうか?
  
  よろしくお願いします

  



  
投稿者 snowmansnow  (社会人) 投稿日時 2021/11/7 18:59:52

 すいません。言語はVBで作ろうとしていました。C#はまだ試していません。
投稿者 るきお  (社会人) 投稿日時 2021/11/7 21:36:17
最近 COM を使おうとしたことがなかったので気が付きませんでした。確かにグレーアウトされていますね。
少し試したところ .NET 5 のクラスライブラリではグレーアウト、.NET Farmework 4.8 のクラスライブラリではOKでした。

.NET Core/.NET 5以降だと、従来とやり方が違うからでしょうか?私もよくわかりませんが、ひとまず、.NET CoreをCOMとして呼び出し可能にする記事はここにありました。
https://docs.microsoft.com/ja-jp/dotnet/core/native-interop/expose-components-to-com

>何が原因で、どうすればクラスライブラリを従来のように、
>各種アプリ(コンソールとかフォームアプリとか、クラスライブラリとか)から
>クラスライブラリが出来るようになるのでしょうか?
ちょっと肝心のご質問がわかりにくかったのですが、
各種アプリからクラスライブラリを呼び出したいのであれば、COMにする必要はありません。むしろCOMにしない方がベターです。
直接.NETのコンポーネント(アセンブリ)としてビルドして参照設定をするのが通常です。NuGetなどのパッケージを経由する方法もあります。
詳しくはこちらで説明しています。
https://www.umayadia.com/VBStandard2/Standard33.htm

この、「COM相互運用機能の登録」が必要になるのは、非.NETの世界(ExcelやVBScriptなど)から、.NETを呼び出す場合です。
投稿者 snowmansnow  (社会人) 投稿日時 2021/11/8 08:34:55

  おはようございます、るきお様
  お返事ありがとうございます
 
   エクセル(2016 64bitと32bit)から呼び出すクラスライブラリを作りたかったです。

   NET Coreやパッケージも今後やって行きたいです。

   NET Farmework 4.8 に戻すには、どうすればいいのでしょうか?
   リストボックスの、他の~をインストールする。
   で、出てくるWEBの4.8の何をインストールすれば
   NET Farmework 4.8 で作れるようになるでしょうか?

   昔のクラスライブラリのNET 4.7がそのままだったので、既に入っている気もするのですが、
   NET Farmework 4.8の選び方、御教授お願いしたいです

   よろしくお願いします
  
    

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/11/8 12:09:52
.NET を
NET と表記することに
違和感がありますが、それはさておき。


> エクセル(2016 64bitと32bit)から呼び出すクラスライブラリを作りたかったです。
32bit 版と 64bit 版とで別々にビルドする必要があります。

ひとまず、.NET 5 製の COM ライブラリ "ClassLibraryNet5" を作ってみました。
細かい手順は、るきおさんが紹介されている URL をご覧ください。

https://gist.github.com/Benshi/4b73898bf4da515fb643e99909e1e298


> NET Farmework 4.8 に戻すには、どうすればいいのでしょうか?
.NET / .NET Core 系のライブラリ プロジェクトと
.NET Framework 系のライブラリ プロジェクトは別管理になるので
プロジェクト ファイル自体は作り直しになります。

その上で、ターゲットフレームワークの選択肢に 4.8 はありますか?
無い場合は、Visual Studio Installer で VS2019 の [変更] を押して
[個別のコンポーネント] から .NET Framework 4.8 を選択します。

あるいは下記から Developer pack と日本語 Language Pack を入手してください。
https://dotnet.microsoft.com/download/dotnet-framework

> ターゲットフレームワークがNET 5.0になった今は?、グレーのままです。
その現バージョンの .NET 5 (現在 5.0.11) は、半年後の来年 5 月にサポート期限を迎えてしまうのですよね…。
一つ前のバージョンとなる .NET Core 3.1 (現在 3.1.9) は LTS なので、来年 12 月末までサポートされるのですけれども。

最新の LTS となる .NET 6 が、13時間半後の「本日 25 時半」(火曜日午前01:30)に
リリースされる予定で、今後はこちらのバージョンがお奨めです。2024年11月までサポートが続きます。



> 久しぶりにVisualStudio2019でクラスライブラリを作ろうと思ったのですが、
そして VS2019 は、2029年4月までのサポートです。(ただしバージョン 16.11.x 系統のみが対象)

> NET Coreやパッケージも今後やって行きたいです。
.NET Framework の更新はもう行われないので、.NET Core 系に進むべきではあるのですが
VB の言語進化は止まってしまったので、VB を使う限り、.NET 系の新機能のほとんどは
享受できないんですよね…。

VB16.0 から VB16.9 への更新として、init-only property を利用できるようにはなりましたが、
あれも「呼び出せる」ようになっただけで、そういうプロパティを VB で作れるわけでは無いですし。
投稿者 snowmansnow  (社会人) 投稿日時 2021/11/8 20:18:29

 こんばんは、魔界の仮面弁士様、るきお様

   .NET 5のクラスライブラリのサンプル動かせました。
   真似できるかわかりませんが、がんばります。

    >.NET を
    >NET と表記することに
    >違和感
     ごめんなさい。何回も注意されてます。

  >32bit 版と 64bit 版
      注意して、別々に作ります。(今回はx86で作ってみました)

  先日のフォントの続きで、
        魔界の仮面弁士様がGekka様のName使えますよ。と仰ってくれたのですが、
    自力で使えませんで、
    仕方なくFontFamilyのNameを取り出す過程(下記)で、クラスライブラリを作りたくなりました。
Imports System.Drawing
Imports System.Drawing.Text


Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'PrivateFontCollectionオブジェクトを作成する 
        Dim fontCol As New System.Drawing.Text.PrivateFontCollection()
        fontCol.AddFontFile("C:\Users\Y2\AppData\Local\Microsoft\Windows\Fonts\ipamjm.ttf")
        'https://dobon.net/vb/dotnet/graphics/privatefontcollection.html 
        'PrivateFontCollectionに追加されているフォントの名前を列挙する 


        For Each ff As System.Drawing.FontFamily In fontCol.Families
            ListBox1.Items.Add(ff.Name)
            'https://www.adonetvb.com/DotNet/refItemsAdd.html 
        Next
        TextBox1.Text = ListBox1.Items(0)
        'https://turtle-engineers.com/vb-listbox-count/ 

    End Sub


End Class

これを改造して、フォントファイルの名前を取り出そうとしました。

るきお様のWEBは、.NET Coreでしたので、そちらも今回頂いたサンプル(インターフェース)で、
できるのではないかと思い、そちらもチャレンジしてみたいです。

時間がございましたら、Gekka様のNameについても御教授頂きたいです。
 
御2人ともありがとうございます。
勉強になります。




投稿者 (削除されました)  () 投稿日時 2021/11/10 00:45:32
(削除されました)
投稿者 (削除されました)  () 投稿日時 2021/11/10 00:53:31
(削除されました)
投稿者 (削除されました)  () 投稿日時 2021/11/10 09:15:04
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/11/10 16:15:18
> 仕方なくFontFamilyのNameを取り出す過程(下記)で

FontFamilyName を得るために、VBA から PrivateFontCollection を呼び出したいという事でよろしいでしょうか。

ライブラリを作るという方針からは外れますが、とりあえず直訳的にはこんな感じになります。
https://gist.github.com/Benshi/abc4bc939306603416ff6d82041bd0af

# すみません。投稿した後で何度か間違いを見つけて再投稿していましたが、
# 削除を繰り返すのも迷惑なので、コード本体は GitHub Gist に置くようにしました。
投稿者 snowmansnow  (社会人) 投稿日時 2021/11/10 20:38:16

 こんばんは、魔界の仮面弁士様、るきお様、皆様
  
  VBAで、凄いです!!
  クラスライブラリの例も凄かったのですが、凄いです。

  この例が無かったら、フォントのファイルが同じなのに、名前やファミリが違う事に
  気づきませんでした!!

  もっと勉強して、皆さんの回答を自分のものにできるようにしたいと思います。

  大変ありがとうございます。