【Visual Studio】IAをPIAに変更してC#からExcelを操作できるようにする。Visual Studio 2008のプロジェクトをVisual Studio 2019へ
IAでExcelを操作しているVisual Studio 2008のプロジェクトをVisual Studio 2019に持ってくる。コンパイルはできるけど、Excelを操作するところで実行時エラーとなる。
「ファイルまたはアセンブリ 'Interop.Office, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。":"Interop.Office, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null"} System.IO.FileNotFoundException」
IAの実態であるInterop.Excel.dllがGACに無いからだろう。
で、GACに以下のコマンドでインストールしようとするが、
gacutil -i c:\work\Interop.Excel.dll
Interop.Excel.dllが厳密名を持っていないため、「厳密な名前のないアセンブリをインストールしようとしました」とメッセージが出てインストールできない。
これはソースファイルでも無ければどうしようもないので、あっさり諦める。
で、PIAへ移行する。
まず、参照の追加で、Microsoft Excel 16.0 Object Libraryを追加する。
追加されると、Microsoft.Office.Interop.Excelが参照設定に増える。
ちなみにInterop.ExcelはIAのもので、もう使わないので削除して良い。
これがPIAで、名前空間はMicrosoft.Office.Interop.Excelなので、IAの名前空間であるExcelをMicrosoft.Office.Interop.Excelに変更する。例えば、
Excel.Application m_objExcel = null;
を
Microsoft.Office.Interop.Excel.Application m_objExcel = null;
に変更する。
これでコンパイルしてみるが、以下でエラーとなる。
m_objSheet = (Microsoft.Office.Interop.Excel._Worksheet)(m_objSheets.get_Item(1));
エラーメッセージは、
エラー CS0656 コンパイラが必要とするメンバー 'Microsoft.CSharp.RuntimeBinder.Binder.Convert' がありません
この解決方法は、ググってすぐに解決した。
'Microsoft.CSharp.RuntimeBinder.Binder.Convert' がありません
https://nonbiri-dotnet.blogspot.com/2017/11/microsoftcsharpruntimebinderbinderconve.html
要は、 Microsoft.CSharpを参照に設定すれば良い。
ありがとう!
これで無事にコンパイルも出来て、Excelファイルを出力することができた。
今ならClosedXMLを使って、簡単にExcelファイルを作ったり弄ったりできるようになったので、PIAでの操作と比べて随分楽になったものです。