スポンサーリンク

.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
System.IO.FileNotFoundExceptionのエラーになります。

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-tag"><<span class="hljs-name">Project</span> <span class="hljs-attr">Sdk</span>=<span class="hljs-string">"Microsoft.NET.Sdk"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">PropertyGroup</span>></span>
<span class="hljs-tag"><<span class="hljs-name">OutputType</span>></span>Exe<span class="hljs-tag"></<span class="hljs-name">OutputType</span>></span>
<span class="hljs-tag"><<span class="hljs-name">TargetFramework</span>></span>net5.0<span class="hljs-tag"></<span class="hljs-name">TargetFramework</span>></span>
<span class="hljs-tag"></<span class="hljs-name">PropertyGroup</span>></span>
<span class="hljs-tag"><<span class="hljs-name">PropertyGroup</span> <span class="hljs-attr">Condition</span>=<span class="hljs-string">"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">PlatformTarget</span>></span>x86<span class="hljs-tag"></<span class="hljs-name">PlatformTarget</span>></span>
<span class="hljs-tag"></<span class="hljs-name">PropertyGroup</span>></span>
<span class="hljs-tag"><<span class="hljs-name">ItemGroup</span>></span>
<span class="hljs-tag"><<span class="hljs-name">COMReference</span> <span class="hljs-attr">Include</span>=<span class="hljs-string">"Microsoft.Office.Excel.dll"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">WrapperTool</span>></span>tlbimp<span class="hljs-tag"></<span class="hljs-name">WrapperTool</span>></span>
<span class="hljs-tag"><<span class="hljs-name">VersionMinor</span>></span>9<span class="hljs-tag"></<span class="hljs-name">VersionMinor</span>></span>
<span class="hljs-tag"><<span class="hljs-name">VersionMajor</span>></span>1<span class="hljs-tag"></<span class="hljs-name">VersionMajor</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Guid</span>></span>00020813-0000-0000-c000-000000000046<span class="hljs-tag"></<span class="hljs-name">Guid</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Lcid</span>></span>0<span class="hljs-tag"></<span class="hljs-name">Lcid</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Isolated</span>></span>false<span class="hljs-tag"></<span class="hljs-name">Isolated</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Private</span>></span>true<span class="hljs-tag"></<span class="hljs-name">Private</span>></span>
<span class="hljs-tag"><<span class="hljs-name">EmbedInteropTypes</span>></span>true<span class="hljs-tag"></<span class="hljs-name">EmbedInteropTypes</span>></span>
<span class="hljs-tag"></<span class="hljs-name">COMReference</span>></span>
<span class="hljs-tag"></<span class="hljs-name">ItemGroup</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Project</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Project</span> <span class="hljs-attr">Sdk</span>=<span class="hljs-string">"Microsoft.NET.Sdk"</span>></span> <span class="hljs-tag"><<span class="hljs-name">PropertyGroup</span>></span> <span class="hljs-tag"><<span class="hljs-name">OutputType</span>></span>Exe<span class="hljs-tag"></<span class="hljs-name">OutputType</span>></span> <span class="hljs-tag"><<span class="hljs-name">TargetFramework</span>></span>net5.0<span class="hljs-tag"></<span class="hljs-name">TargetFramework</span>></span> <span class="hljs-tag"></<span class="hljs-name">PropertyGroup</span>></span> <span class="hljs-tag"><<span class="hljs-name">PropertyGroup</span> <span class="hljs-attr">Condition</span>=<span class="hljs-string">"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"</span>></span> <span class="hljs-tag"><<span class="hljs-name">PlatformTarget</span>></span>x86<span class="hljs-tag"></<span class="hljs-name">PlatformTarget</span>></span> <span class="hljs-tag"></<span class="hljs-name">PropertyGroup</span>></span> <span class="hljs-tag"><<span class="hljs-name">ItemGroup</span>></span> <span class="hljs-tag"><<span class="hljs-name">COMReference</span> <span class="hljs-attr">Include</span>=<span class="hljs-string">"Microsoft.Office.Excel.dll"</span>></span> <span class="hljs-tag"><<span class="hljs-name">WrapperTool</span>></span>tlbimp<span class="hljs-tag"></<span class="hljs-name">WrapperTool</span>></span> <span class="hljs-tag"><<span class="hljs-name">VersionMinor</span>></span>9<span class="hljs-tag"></<span class="hljs-name">VersionMinor</span>></span> <span class="hljs-tag"><<span class="hljs-name">VersionMajor</span>></span>1<span class="hljs-tag"></<span class="hljs-name">VersionMajor</span>></span> <span class="hljs-tag"><<span class="hljs-name">Guid</span>></span>00020813-0000-0000-c000-000000000046<span class="hljs-tag"></<span class="hljs-name">Guid</span>></span> <span class="hljs-tag"><<span class="hljs-name">Lcid</span>></span>0<span class="hljs-tag"></<span class="hljs-name">Lcid</span>></span> <span class="hljs-tag"><<span class="hljs-name">Isolated</span>></span>false<span class="hljs-tag"></<span class="hljs-name">Isolated</span>></span> <span class="hljs-tag"><<span class="hljs-name">Private</span>></span>true<span class="hljs-tag"></<span class="hljs-name">Private</span>></span> <span class="hljs-tag"><<span class="hljs-name">EmbedInteropTypes</span>></span>true<span class="hljs-tag"></<span class="hljs-name">EmbedInteropTypes</span>></span> <span class="hljs-tag"></<span class="hljs-name">COMReference</span>></span> <span class="hljs-tag"></<span class="hljs-name">ItemGroup</span>></span> <span class="hljs-tag"></<span class="hljs-name">Project</span>></span>
<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の時と違いはありません。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
using System;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace HelloWorld
{
<span class="hljs-keyword">class</span> <span class="hljs-keyword">Program</span>
{
static void Main(string[] <span class="hljs-keyword">args</span>)
{
<span class="hljs-keyword">var</span> excelName = @<span class="hljs-string">"C:\temp\sample.xls"</span>;
Console.WriteLine(<span class="hljs-string">"Hello World!"</span>);
<span class="hljs-keyword">var</span> oXls = new Excel.Application();
oXls.Visible = true;
<span class="hljs-keyword">var</span> oWorkbook = oXls.Workbooks.<span class="hljs-keyword">Open</span>(
excelName, <span class="hljs-comment">// オープンするExcelファイル名</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)UpdateLinks (0 / 1 / 2 / 3)</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)ReadOnly (True / False )</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Format</span>
<span class="hljs-comment">// 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;)</span>
<span class="hljs-comment">// 5:なし / 6:引数 Delimiterで指定された文字</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Password</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)WriteResPassword</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)IgnoreReadOnlyRecommended</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Origin</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Delimiter</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Editable</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Notify</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Converter</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)AddToMru</span>
<span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Local</span>
<span class="hljs-keyword">Type</span>.Missing <span class="hljs-comment">// (省略可能)CorruptLoad</span>
);
Console.Write(<span class="hljs-string">"エンターキーでExcelを閉じる: "</span>);
Console.ReadLine();
oWorkbook.<span class="hljs-keyword">Close</span>();
oXls.Quit();
<span class="hljs-comment">// これを忘れてはダメ</span>
#pragma warning disable CA1416 <span class="hljs-comment">// プラットフォームの互換性の検証</span>
_ = Marshal.ReleaseComObject(oWorkbook);
_ = Marshal.ReleaseComObject(oXls);
#pragma warning <span class="hljs-keyword">restore</span> CA1416 <span class="hljs-comment">// プラットフォームの互換性の検証</span>
Console.ReadLine();
}
}
}
using System; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel; namespace HelloWorld { <span class="hljs-keyword">class</span> <span class="hljs-keyword">Program</span> { static void Main(string[] <span class="hljs-keyword">args</span>) { <span class="hljs-keyword">var</span> excelName = @<span class="hljs-string">"C:\temp\sample.xls"</span>; Console.WriteLine(<span class="hljs-string">"Hello World!"</span>); <span class="hljs-keyword">var</span> oXls = new Excel.Application(); oXls.Visible = true; <span class="hljs-keyword">var</span> oWorkbook = oXls.Workbooks.<span class="hljs-keyword">Open</span>( excelName, <span class="hljs-comment">// オープンするExcelファイル名</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)UpdateLinks (0 / 1 / 2 / 3)</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)ReadOnly (True / False )</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Format</span> <span class="hljs-comment">// 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;)</span> <span class="hljs-comment">// 5:なし / 6:引数 Delimiterで指定された文字</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Password</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)WriteResPassword</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)IgnoreReadOnlyRecommended</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Origin</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Delimiter</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Editable</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Notify</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Converter</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)AddToMru</span> <span class="hljs-keyword">Type</span>.Missing, <span class="hljs-comment">// (省略可能)Local</span> <span class="hljs-keyword">Type</span>.Missing <span class="hljs-comment">// (省略可能)CorruptLoad</span> ); Console.Write(<span class="hljs-string">"エンターキーでExcelを閉じる: "</span>); Console.ReadLine(); oWorkbook.<span class="hljs-keyword">Close</span>(); oXls.Quit(); <span class="hljs-comment">// これを忘れてはダメ</span> #pragma warning disable CA1416 <span class="hljs-comment">// プラットフォームの互換性の検証</span> _ = Marshal.ReleaseComObject(oWorkbook); _ = Marshal.ReleaseComObject(oXls); #pragma warning <span class="hljs-keyword">restore</span> CA1416 <span class="hljs-comment">// プラットフォームの互換性の検証</span> Console.ReadLine(); } } }
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したいときには以下を参照。

コメント

タイトルとURLをコピーしました