.NET 5プロジェクトでのCOM参照の追加

Visual Studio 2019 v16.6より.NET CoreプロジェクトでのCOM参照の仕組みが追加されており、Visual Studio 2019 v16.8/.NET 5でもその機能を使うことが出来ます。こういうめんどくさいことはツールサポートが無いとやっていられません。

ここではコンソールアプリからExcelのCOM Automationを使う方法をサンプルとして提示したいと思います。

まず、Visual Studio 2019で.NET 5のコンソールアプリケーションのプロジェクトを作成し、以下のように依存関係のコンテキストメニューから「COM参照の追加」を選択します。

そうすると、見慣れたCOM参照の追加ダイアログが表示されます。

Excelを参照します。そうすると以下のようにinteropアセンブリが追加されます。

ここで大事なのは、このinteropアセンブリを選択して以下のように「ローカルコピー」「相互運用性の埋め込み」の両方を「はい」に設定しておきます。こうしておかないと実行時にSystem.IO.FileNotFoundExceptionのエラーになります。

必要な準備はこれだけです。これでcsprojファイルに以下のようにCOM参照の定義が追加され、必要なinteropアセンブリがプロジェクトに追加されます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <COMReference Include="Microsoft.Office.Excel.dll">
      <WrapperTool>tlbimp</WrapperTool>
      <VersionMinor>9</VersionMinor>
      <VersionMajor>1</VersionMajor>
      <Guid>00020813-0000-0000-c000-000000000046</Guid>
      <Lcid>0</Lcid>
      <Isolated>false</Isolated>
      <Private>true</Private>
      <EmbedInteropTypes>true</EmbedInteropTypes>
    </COMReference>
  </ItemGroup>

</Project>

実際にExcelを使うコードは以下のようになりますが、これは.NET Frameworkの時と違いはありません。

using System;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            var excelName = @"C:\temp\sample.xls";
            Console.WriteLine("Hello World!");
            var oXls = new Excel.Application();
            oXls.Visible = true;
            var oWorkbook = oXls.Workbooks.Open(
                excelName,  // オープンするExcelファイル名
                Type.Missing, // (省略可能)UpdateLinks (0 / 1 / 2 / 3)
                Type.Missing, // (省略可能)ReadOnly (True / False )
                Type.Missing, // (省略可能)Format
                              // 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;)
                              // 5:なし / 6:引数 Delimiterで指定された文字
                Type.Missing, // (省略可能)Password
                Type.Missing, // (省略可能)WriteResPassword
                Type.Missing, // (省略可能)IgnoreReadOnlyRecommended
                Type.Missing, // (省略可能)Origin
                Type.Missing, // (省略可能)Delimiter
                Type.Missing, // (省略可能)Editable
                Type.Missing, // (省略可能)Notify
                Type.Missing, // (省略可能)Converter
                Type.Missing, // (省略可能)AddToMru
                Type.Missing, // (省略可能)Local
                Type.Missing  // (省略可能)CorruptLoad
            );
            Console.Write("エンターキーでExcelを閉じる: ");
            Console.ReadLine();
            oWorkbook.Close();
            oXls.Quit();

            // これを忘れてはダメ
#pragma warning disable CA1416 // プラットフォームの互換性の検証
            _ = Marshal.ReleaseComObject(oWorkbook);
            _ = Marshal.ReleaseComObject(oXls);
#pragma warning restore CA1416 // プラットフォームの互換性の検証

            Console.ReadLine();
            
        }
    }
}

参考:

.NET 5 / .NET CoreでCCWしたいときには以下を参照。

.NET 5でシングルバイナリを作る

.NET Coreから.NETのアプリケーションを1本の実行ファイル(シングルバイナリ)にする方法が出来て、.NET 5でも当然引き継がれています。

ちなみに、シングルバイナリファイルを正式には単一ファイルアプリケーション(Single-file Publish)と呼びます。

dotnetコマンドでシングルバイナリを作成する。

.NET 5でシングルバイナリを作るにはコマンドラインでは以下の方法があります。

Linux: dotnet publish -r linux-x64 /p:PublishSingleFile=true

このコマンドラインではHelloWorld, HelloWorld.pdbの二つのファイルが作成されます

Windows : dotnet publish -r win-x64 /p:PublishSingleFile=true

このコマンドラインでは次のファイルが作成されます。

HelloWorld.exe, HelloWorld.pdb, coreclr.dll, clrjit.dll, clrcompression.dll, mscordaccore.dll

Windowsでは一つのファイルとは行かずにいくつかの最低限のライブラリDLLをいっしょに配置する必要があります。これでは「シングルバイナリー」とは呼びづらいですね。

Linuxと同様に1つのEXEファイルにランタイムライブラリもまとめたい場合には以下のようにします。

Windows: dotnet publish -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true

これで生成されるファイルは以下の二つになります。

HelloWorld.exe, HelloWorld.pdb

先ほどまとめたい場合と書きましたが、それには理由があり、この1本に見えるEXEファイルは実際には自己展開される圧縮ファイルであり、先ほど/p:IncludeNativeLibrariesForSelfExtract=trueが指定されなかった場合に配置されたランタイムのDLLが実行ファイルといっしょに自己解凍方式の圧縮ファイルに圧縮されている形式になります。ただし、この方法でWindowsでも1本のEXEファイルにする事はできました。

Visual Studio 2019でシングルバイナリを作成する

プロジェクトファイルのコンテキストメニューから発行を選択します。

フォルダを選択します。

ここでもフォルダを選択します。

とりあえずこのままでもかまいません。

公開の設定画面になるので、上の図の矢印の先にあるペン型のアイコンクリックします。

プロファイル設定画面で詳細を設定します。大事なのは配置モードを自己完結にすること、ファイル公開オプションで単一ファイルの作成を選択します。この設定内容で、コマンドラインで次のように設定したのと同じになります。

dotnet publish -r win-x64 /p:PublishSingleFile=true

上のコマンドと同じであるため、発行ボタンをクリックすると以下のファイルが先ほど指定した公開先のフォルダに生成されます。

HelloWorld.exe, HelloWorld.pdb, coreclr.dll, clrjit.dll, clrcompression.dll, mscordaccore.dll

現状、VSのGUIからは/p:IncludeNativeLibrariesForSelfExtract=trueオプションを指定する方法がないようなので、WindowsでEXE1本にどうしてもまとめたい場合にはコマンドラインから操作する以外に方法はないようです。

参考:

Formula Eが世界選手権化 #ABBFormulaE

2020-2021シーズン(2021年1月開幕)よりABB Formula Eは正式にFIA認定の世界選手権となります。これはFormula EがF1, WEC, WRC, World RXと並ぶ世界最高峰の自動車レースになったこと示しています。

今回はこれをお祝いし、記念のビデオが作られました。

Forza Horizon 5が来年Forza Motorsportの新版より先に出るという噂

We know a new Forza Motorsport is on the way, but could Forza Horizon 5 actually hit the track before it? Check out the latest rumors.

情報源: Forza Horizon 5 Rumored to be Coming in 2021 Before the Next Forza Motorsport

Forza Horizon 5が来年Forza Motorsportの新版より先に出るという噂が最近多くなってきました。舞台が日本になるという噂もありますが、それはともかく、MSはHALO新作も送れ、Xbox Series X|S向けのAAAタイトルが過小な状況が続いています。Game Passの契約を継続させ、利用者を増やすためにも、開発に時間がまだかかりそうなMortosportよりも、現行の延長線で舞台を新たに「リニューアル」したHorizon 5を投入してくる可能性は高そうです。

オータム #Forzathon 11/27~12/4 #ForzaHorizon4

シーズンは日本時間では木曜日23時30分に切り替わります。夏から秋になりました。

正確には11/26 23:30~12/3 23:30まで。

シリーズリワード

  • Horizon Backstage Pass
  • 2013 Jeep Wrangler Unlimited DeBerti Design

シーズンリワード

  • 50% 1995 BMW 850 CSi(New)
  • 80% 2014 HSV GEN-F GTS

1995 BMW 850 CSi

フォトチャレンジ #ScotLandTheBrave

EdinburghのScott Monumentで自分のマシンのフォトを撮る。

クリア

Continue reading オータム #Forzathon 11/27~12/4 #ForzaHorizon4

NTTが宇宙線によって生み出される半導体のソフトウェアエラーの全貌に関する論文を発表

世界で初めて半導体ソフトエラーを引き起こす中性子のエネルギー特性を測定:NTT持株会社ニュースリリース:NTT HOME

日本電信電話株式会社(本社:東京都千代田区、代表取締役社長:澤田 純、以下「NTT」)および国立大学法人東海国立大学機構名古屋大学(愛知県名古屋市、総長:松尾 清一、以下「名古屋大学」)、国立大学法人北海道大学(北海道札幌市、総長:寳金 清博、以下「北海道大学」)は共同で、中性子のもつエネルギーごとの半導体ソフトエラー(※1)発生率(※2)を“連続的な”データとして実測することに成功し、その全貌を世界で初めて明らかにしました。

俺たちのNTTがやってくれましたよ。論文自体大変興味深いのでリンク先をぜひ。

Windows 10 Insider Preview Build 19042.662 (20H2)

Hello Windows Insiders, today we’re releasing 20H2 Build 19042.662 (KB4586853) to the Beta and Release Preview Channels for those Insiders who are on 20H2 (

情報源: Announcing Windows 10 Insider Preview Build 19042.662 (20H2) | Windows Insider Blog

Beta Channnel / Release Preview向けのCU。

多数のバグ修正。日本(日本語)固有の問題点も修正。

Visual Studio 2019 version 16.8.2 Release 

Get the latest features, bug fixes, and support for Visual Studio 2019 v16.8. Download today.

情報源: Visual Studio 2019 version 16.8 Release Notes | Microsoft Docs

出ました。基本的にバグ修正です。