QA@IT

.NetFramework4.0 でのExcelアクセス

29187 PV

VB.Net、.NetFramework4.5で、Excelに以下の方法でアクセスすることができました。

        Dim ExcelConnectString As String = 
            "Provider=Microsoft.ACE.OLEDB.12.0; " & 
            "Data Source=C:\Test\Test.xlsx" & ";" & 
            "Extended Properties=""Excel 12.0;HDR=YES;"""

        Dim conExcel As OleDbConnection 'Excle接続オブジェクト

        Try
            'Excelファイル接続
            conExcel = New OleDbConnection(ExcelConnectString )
            conExcel .Open()
        Catch ex As Exception
            Exit Sub
        End Try

        gconExcel.Close()

ところが、VisualStudioでプロジェクトのプロパティから.NetFramework4.5を4.0に変更すると、
gconExcel.Open()の箇所で「Microsoft.ACE.OLEDB.12.0プロバイダが登録されていません」という
エラーが発生します。
「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」を
再インストールしても変わりません。
https://www.microsoft.com/ja-jp/download/details.aspx?id=13255

プロジェクトのプロパティで4.5に戻すだけではエラーは解消せず、.vbprojのファイルをエディタで開いて、
「false」という箇所を削除するとまた正常に動作しました。

Windows8.1 64bitで、MS Officeは2013 32bit版です。
先の再頒布可能コンポーネントをインストールする際、Officeが32bitなので再頒布可能コンポーネントも
32bit版でしかインストールはできませんでした。

.NetFramework4.0ではこの方法ではアクセス出来ないのでしょうか?
アドバイスの程よろしくお願い致します。

回答

削除したfalseという箇所はどんな内容だったのでしょう?4.0に変更してその箇所を同様に削除した場合はどのような挙動になるのでしょう?

Officeが32ビット環境ならターゲットCPUはx86にした方がよいと思います。

VS2012以降だと設定内容が変わっているようでした。

http://sourcechord.hatenablog.com/entry/20130412/1365789867

このリンク先にある32ビットの優先チェックが外れていると思いますのでこれにチェックを入れるとよいと思います。

.NetFramework4.0ではこの方法ではアクセス出来ないのでしょうか?

これ以外の方法として例えば、Excelオブジェクトを使用した方法でもアクセスは可能です。

編集 履歴 (1)
  • ご回答ありがとうございます。
    正常に動作していた4.5のプロジェクトファイルと、4.0から4.5に戻したプロジェクトファイルを比較したところ、<Prefer32Bit>false</Prefer32Bit>という行が増えていたので試しに削除しました。(記述漏れでした。申し訳ございません。
    Excelが入っていない環境でも動作させたいので、質問の方法を取っています。
    -

自分が使っているのは VS2010 なので知りませんでしたが、「32ビットの優先」というのは Visual Studio 2012 から追加された .NET 4.5 のみで使用できる新機能のようですね。(おかげさまで一つ利口になりました)

[ビルド] ページ (プロジェクト デザイナー) (C#)
https://msdn.microsoft.com/ja-jp/library/kb4wyys2.aspx

上記のページによると "チェック ボックスがオンの場合、アプリケーションは、Windows の 32 ビット バージョンおよび 64 ビット バージョンで 32 ビット アプリケーションとして実行されます" とのことで、かつ .NET 4 にはその機能はないということです。

(ちなみに、.NET 4.5 の Any CPU + 「32ビットの優先」と、.NET 4 以下の x86 は何が違うんだと思って調べてみましたが、前者は ARM の Windows 環境でも動くという点が違うという話でした)

そうすると質問者さんのケースと話の辻褄が合いますね。

(1) .NET 4.5 で Any CPU として作ったアプリは、「32ビットの優先」の機能により、Windows8.1 64-bit OS の WOW64 上で 32-bit で動いていて、ACE プロバイダも 32-bit 版なので問題なかった。

(2) .NET 4 で Any CPU として作ったアプリは、Windows8.1 64-bit OS 上で 64-bit で動いていていたが、ACE プロバイダが 32-bit 版なのでエラーとなった。

ということは、インストールするACEプロバイダと合わせないといけないということですよね?

対象のフレームワークを .NET 4 にするのであれば、プラットフォームターゲットを x86 にして、ACE プロバイダは今使っている 32-bit 版にしておけば、OS が 32/64-bit のいずれでも動くはずです(64-bit OS の場合は WOW64 上で動く。アプリを Any CPU または x64 とし ACE を 64-bit 版にしたりすると 32-bit OS では動かなくなるので止めた方がいいと思います)。

.NET 4.5 なら今のままの設定にしておいても 32/64-bit OS 両方に対応できると思います。(個人的には Any CPU ではなく x86 にしておくべきと思いますが)

なお、ACE プロバイダは同一 PC 上で 32/64-bit 版の共存ができないそうなので注意してください(ウラワザ的手法はあるようですが)。

また、先にも書きましたが Office/Excel の 32/64-bit は関係ないです。(Office/Excel を動かすわけではないので)

編集 履歴 (1)
  • なるほど。原因と対応方法がわかりました。問題のACEプロバイダは32bitのExcelが入ってると、32bit版しかインストール出来ないため注意が必要ですね。勉強になりました!! -

ちなみに、考え方としては、32ビット優先はその名の通り、x86とx64どっちか選択可能な状況なら32ビットモードを優先して選択して動かし、選択の余地がない状況ではそのまま何でも動くというイメージになります。
例えば64ビットで起動したプロセスから32ビット優先のexeは64ビットモードでロードできますが、x86指定のexeはロードできません。
ARMの場合も同様で、x86もx64も選択できない環境なので、そのままARMで動作します。
ということで、すでに書かれてますが、あくまでx86で動かす前提にするのであれば、意味的にはx86を指定するのが良いだろうと思われます。

編集 履歴 (0)
  • 直接関係ないですが、ちょっと昔の網羅度測定ツールのPartCoverが、32ビット優先設定のexeでは正常に動作しないのではまったことがありました。 -
  • 32bit版と64bit版の両方のexeを用意しておいた方が良さそうですね。 -

Shu さんの回答と一部ダブリますが・・・

Visual Studio のプラットフォームターゲットの設定はどうなっていますか?(プロジェクトの Properties を右クリックして開いて、[ビルド]タブを見てください)

考えられるのは、(1) .NET 4.5 のときは x86 になっていて Windows8.1 64-bit では WOW64 上でアプリが動いていて、ACE プロバイダも 32-bit なので問題なし、(2) .NET 4 のときは x64 または Any CPU になっていて Windows8.1 64-bit では 64-bit で動いているが ACE プロバイダが 32-bit なので NG ということなのですが・・・

32/64-bit 動作の基本は以下の記事が参考になると思いますので、目を通されることをお勧めします。

Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspx

Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx

上で言う (1) が Part. 2 の Step. 9 の下の図の「例 4」、(2) が「例 3」に該当します。

#Excel のバージョン、32/64-bit は関係ないです。

編集 履歴 (1)
  • VS2013なのですが「対象のCPU」はいずれもAnyCPUでした。しかし、
    .NET 4.5→「32ビットの優先」チェックボックスがONでした。
    .NET 4.0→「32ビットの優先」はグレーアウトです。「対象のCPU」をX86に変更すると動作しました。ご指摘のとおりの動作をしていたと思います。
    ということは、インストールするACEプロバイダと合わせないといけないということですよね?
    -
  • 回答内容に対する返答がなかったのでx86の選択がないのかと思いましたが、あったのですね。32bitのdllを呼ぶには32bitで動作するようコンパイルされていなければだめなのです。『?』の意味が分からないのですが何を再確認したいのでしょうか? -
  • 書ききれないので解答欄に返信します。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。