トップ回答者
VS2013,.netFramework4.5におけるx86アプリに関して

質問
-
お世話になっております。
現在、VisualStudio2008にて32Bit、64Bitで稼動可能だったアプリをVisualStudio2013にアップグレードし、
ターゲットフレームワークを.NetFramework4.5.1にしてインストーラーの稼動確認を行っています。
32bit端末では稼動できるのですが、64Bit端末では下記のエラーが発生しております。
**********************************************************
エラーが発生しました。
System.Runtime.InteropServices.COMException (0x80040154): クラスが登録されていません (HRESULT からの例外:0x80040154 (REGDB_E_CLASSNOTREG))
場所 System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
場所 System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
場所 System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
場所 System.Windows.Forms.AxHost.CreateInstance()
場所 System.Windows.Forms.AxHost.GetOcxCreate()
場所 System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
場所 System.Windows.Forms.AxHost.CreateHandle()
場所 System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
場所 System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
場所 System.Windows.Forms.AxHost.EndInit()**********************************************************
上記エラーが発生している箇所は、フォームデザイナーで自動生成されているコーディング箇所で、
AxComctLib.AxToolbarのオブジェクトに対し、
「CType(Me.tbToolBar, System.ComponentModel.ISupportInitialize).EndInit()」と
コーディングされている箇所になります。
元々、VB6で作成されていたアプリをVB6⇒VB2003⇒VB2008とアップグレードしているため、VB6のコントロールを使用しています。
そのため、インストールする端末においてはVB6のライセンス用のレジストリKEYの追加及びコントロールの配置を行っています。
32Bit、64Bit双方の稼動確認端末において、必要なコントロールに関しては同じ設定を行っている上で、
VB2008(.netFrameWork3.5.1)アプリでは32Bit、64Bit双方の端末で稼動可能で、
VB2013(.netFrameWork4.5.1)アプリでは64Bitのみエラーが発生する、ということは、
.netFramework4.5.1だと32Bitと64Bitの互換性が100%ではない、とい事になるのでしょうか。
もしくは、何か開発側で回避できる方法があるのでしょうか。
以下、開発環境の詳細になります。
何か、情報をお持ちの方がいましたら、教えて頂きますよう、お願い致します。
【開発環境】
・端末:Windows7 32Bit
・開発環境:Visual Studio Professional2013
・ターゲットフレームワーク:.NetFramework4.5.1
回答
-
基本的なこととして、64bit OSでは32bitアプリケーション、64bitアプリケーション双方を動作させることができます。
その前提で、質問者さんの作成したアプリケーションはVS2008を使用した際には64bit動作させていたのでしょうか? またVS2013でエラーになったアプリケーションはVS2008と同じでしょうか?
それとは別に、質問者さんは64bit OS上で、64bit動作させたいですか? それとも32bit動作させたいですか?以上のことが質問文から読み取れませんでした。
またAxComctLibはVS2008 / VS2013どちらにも含まれていないコンポーネントであり、サポート範囲が異なります。
- 回答としてマーク 星 睦美 2014年6月24日 4:13
-
VB6 付属の ActiveX コントロールだというのであれば、64bit OS 上で 64bit プロセスとして使うことはできないでしょう。
今まで 64bit OS で動かせていたのは、64bit OS 上で 32bit プロセスとして動かしていたからでしょうから、アプリケーションプロジェクトのターゲットプラットフォームが x86 になっていることを確認することからでしょうか。なお、VB6 に付属していたものはあくまで VB6 とセットでの開発・頒布を想定しているはずです。
使用許諾から、再頒布する権利について再確認してください。ところで、ToolBar とのことですが、ActiveX コントロールを使わないといけない理由はあるのでしょうか。
ないのであれば、ここらで .NET Framework が用意しているクラスに乗り換えを検討した方がよいのでは。- 回答としてマーク 星 睦美 2014年6月24日 4:13
-
すでに他の回答者の方から回答が出ていますが、アプリの 32/64-bit 対応について参考になると思われる記事を紹介しておきます。
Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspxPart 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspxPart 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/13/part-3-asp-net-2-0-web-64.aspx
> VB6のコントロールを使用しています。Part 3 の Step 15 の記述によると、VB6 ランタイムは 32-bit 版しかないそうです。
> VB2008(.netFrameWork3.5.1)アプリでは32Bit、64Bit双方の端末で稼動可能で、どうしてそれが可能だったかは Part 2 の Step 8 あたりに書いてあります。
- 回答としてマーク 星 睦美 2014年6月24日 4:14
すべての返信
-
基本的なこととして、64bit OSでは32bitアプリケーション、64bitアプリケーション双方を動作させることができます。
その前提で、質問者さんの作成したアプリケーションはVS2008を使用した際には64bit動作させていたのでしょうか? またVS2013でエラーになったアプリケーションはVS2008と同じでしょうか?
それとは別に、質問者さんは64bit OS上で、64bit動作させたいですか? それとも32bit動作させたいですか?以上のことが質問文から読み取れませんでした。
またAxComctLibはVS2008 / VS2013どちらにも含まれていないコンポーネントであり、サポート範囲が異なります。
- 回答としてマーク 星 睦美 2014年6月24日 4:13
-
VB6 付属の ActiveX コントロールだというのであれば、64bit OS 上で 64bit プロセスとして使うことはできないでしょう。
今まで 64bit OS で動かせていたのは、64bit OS 上で 32bit プロセスとして動かしていたからでしょうから、アプリケーションプロジェクトのターゲットプラットフォームが x86 になっていることを確認することからでしょうか。なお、VB6 に付属していたものはあくまで VB6 とセットでの開発・頒布を想定しているはずです。
使用許諾から、再頒布する権利について再確認してください。ところで、ToolBar とのことですが、ActiveX コントロールを使わないといけない理由はあるのでしょうか。
ないのであれば、ここらで .NET Framework が用意しているクラスに乗り換えを検討した方がよいのでは。- 回答としてマーク 星 睦美 2014年6月24日 4:13
-
すでに他の回答者の方から回答が出ていますが、アプリの 32/64-bit 対応について参考になると思われる記事を紹介しておきます。
Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspxPart 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspxPart 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/13/part-3-asp-net-2-0-web-64.aspx
> VB6のコントロールを使用しています。Part 3 の Step 15 の記述によると、VB6 ランタイムは 32-bit 版しかないそうです。
> VB2008(.netFrameWork3.5.1)アプリでは32Bit、64Bit双方の端末で稼動可能で、どうしてそれが可能だったかは Part 2 の Step 8 あたりに書いてあります。
- 回答としてマーク 星 睦美 2014年6月24日 4:14
-
佐祐理 様
ご回答、ありがとうございます。
現在、対応しているアプリケーションのターゲットは32Bitです。よって。ターゲットCPUをx86に指定しビルドしています。
VB2013 とVB2008で稼動確認しているアプリケーションは同じになります。
VB2008で元々上記設定で稼動していたソリューションを、VB2013でコンバージョンし、ターゲットフレームワークを4.5.1に変更しております。
ActiveXコントロールのオブジェクトに問題がありそう、という事までは分かったのですが、
フレームワークとActiveXの組合せの問題ならば、32Bit端末&.NetFramework4.5.1でもエラーになるはず。
64Bit端末とActiveXの組合せの問題ならば、64Bit端末&VB2008でもエラーになるはず。
と考え、そうすると、
64Bit端末&NetFramework4.5.1&ActiveXコントロールでエラーになるならば、
NetFramework4.5.1に32Bitと64Bitとで何か違いがあるのか、という所に思考が行きました。
ActiveXコントロールのサポート範囲に関して、調査してみます。
ありがとうございました。
- 編集済み TSK33 2014年6月19日 6:55
-
Azulean 様
ご回答、ありがとうございます。
再度、ビルド構成のターゲットプラットフォーム及び、プロジェクトプロパティ画面→コンパイル画面の対象CPUがx86になっていることを確認致しました。
ご指摘のとおり、ActiveX を使用しないでフレームワークを利用することが、正攻法な対応だと思いますが、
200を超えるFormにてActiveXを使用しているため、何とか対応できないかと考えていました。
こちらのフォーラムにて皆様からの回答を参考にさせて頂き、もう少しだけ、ねばってみようと思います。
ありがとうございました。
- 編集済み TSK33 2014年6月19日 6:56