トップ回答者
エラー 「タイプ ライブラリ "MSComctlLib" のラッパー アセンブリが見つかりません」 に対する対処

質問
-
私は現在,物性の研究をしています.
そのためにvb.netを用いて自動測定システムというものを作成しているのですが,その途中で以下のようなエラーが表示されるようになったために,プログラムの実行が完了できなくなりました.
警告 1 タイプ ライブラリ "MSComctlLib" のラッパー アセンブリが見つかりません。次のことを確認してください。(1) COM コンポーネントが正しく登録されている。(2) ターゲット プラットフォームのビットが COM コンポーネントと同じである。たとえば、COM コンポーネントが 32 ビットの場合、64 ビットのターゲット プラットフォームは使用できません。
警告 2 アセンブリ 'Interop.MSComDlg' からの間接的な参照が原因で、埋め込まれた相互運用機能アセンブリ 'stdole' に対して参照が作成されました。両方のアセンブリで '相互運用機能型の埋め込み' プロパティを変更することを検討してください。
以前まではこのようなエラーが無く,正常に実行ができていたのですが,別の方に,PCのインターネット環境を整えてもらったところこのようなエラーが表示されるようになりました.
プログラムのソースやvisual studioの設定は変更していないので,このPC自体の環境が変わってしまったのかもしれません.
使用中のPCのシステムの種類は32ビットオペレーティングシステムです.
このエラーに関する対処法がないかインターネットにて調べてみたのですが,なかなか良い情報が見つかりません.
私はまだまだ研究を始めたばかりで,vbに関してやCOMに関する知識が乏しい状態です.
どなたか情報提供の協力をお願いします.
回答
-
MSComctlLib だけでなく、もう一方の MSComDlg も置き換えが必要です。
MSComDlg は、CommonDialog コントロールの ActiveX コンポーネントです。
これは、OS 標準の「コモン ダイアログ」の画面を呼び出すために使われます。
(表示される画面は、実行する OS によって、多少異なるレイアウトになります)まず、この CommonDialog というものは、
1: [ファイルを開く] を表示
2: [ファイル名を付けて保存] を表示
3: [色の設定] を表示
4: [フォントの指定] を表示
5: [印刷] を表示
6: [ヘルプ] を起動
という、最大で 6 種の画面を呼び出す機能を持っています。
VB2 以降では、CommonDialog の「Action プロパティ」に
これらの数字を代入することで呼び出します。
VB4 以降では、それぞれの機能が
1: ShowOpen メソッド
2: ShowShowSave メソッド
3: ShowColor メソッド
4: ShowFont メソッド
5: ShowPrinter メソッド
6: ShowHelp メソッド
という異なるメソッドの呼び出しに割り当てられています。
そして .NET においては、CommonDialog に相当する機能が、
異なるクラスに割り当てられています。
(いずれのクラスも System.Windows.Forms 名前空間にあります)1: OpenFileDialog クラスの ShowDialog メソッド
2: SaveFileDialog クラスの ShowDialog メソッド
3: ColorDialog クラスの ShowDialog メソッド
4: FontDialog クラスの ShowDialog メソッド
5: PrintDialog クラスの ShowDialog メソッド
6: Help クラスの ShowHelp 共有メソッド
元のソースが、CommonDialog をどのように呼び出しているかを
調査した上で、適宜、これらのクラスに差し替えてみてください。
(具体的な使い方は、ネット上などで簡単に見つかるはずです)※注記※
1~5 番は、機能面での互換性がありますが、6 番は非互換です。CommonDialog のヘルプ起動は、「WinHelp」や「WinHlp32」と
呼ばれる、*.hlp ファイルのためのものです(Windows Vista にて廃止)。一方、Help クラスが扱うのは、HTML Help とよばれる
別形式のヘルプファイルです(*.chmファイル、または HTML ヘルプ)。- 回答としてマーク 星 睦美 2014年9月29日 7:37
-
MSComm Control 6.0が良くないのですね。合ってますでしょうか?
確かに置き換えは必要ですが、それは別のコントロールです。
MSComm とは、コミュニケーション コントロールとも呼ばれており、
シリアルポート(RS-232C)を通じて通信を行うためのものです。「MSComDlg」「MSCommLib」「ComctlLib」「MSComctlLib」「ComCtl2」「MSComCtl2」「ComCtl3」……名前が似たものが多いのでご注意を!
以下に、置き換え後のクラス名を列挙しておきます。
- MSCommLib(MSCOMM32.OCX : Comm Controls 6.0)
- MSComm コントロール → System.IO.Ports.SerialPort クラス
- MSComDlg(COMDL32.OCX : Common Dialog Controls 6.0)
- CommonDialog クラス → 機能ごとに呼び出すクラスが変わります。先の回答を参照して下さい。
- ComctlLib(COMCTL32.OCX : Windows Common Controls 5.0)
- TabStrip コントロール → System.Windows.Forms.TabControl クラス
- Toolbar コントロール → System.Windows.Forms.ToolStrip クラス
- StatusBar コントロール → System.Windows.Forms.StatusStrip クラス
- ProgressBar コントロール → System.Windows.Forms.ProgressBar クラス
- TreeView コントロール → System.Windows.Forms.TreeView クラス
- ListView コントロール → System.Windows.Forms.ListView クラス
- ImageList コントロール → System.Windows.Forms.ImageList クラス
- Slider コントロール → System.Windows.Forms.TrackBar クラス
- MSComctlLib(MSCOMCTL.OCX : Windows Common Controls 6.0)
- ImageCombo コントロール → ComboBox の DrawItem イベントで代用してみてください。
- TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListView, ImageList, Slider コントロール → 上記 ComctlLib の場合と同様です。
- ComCtl2(COMCT232.OCX : Windows Common Controls-2 5.0)
- Animation コントロール → 同等機能はありません。*.avi の代わりに、*.gif を PictureBox で表示するなどで回避してみてください。
- UpDown コントロール → 同等機能はありません。DomainUpDown や NumericUpDown クラスで代用できないか検討して下さい。
- MSComCtl2(MSCOMCT2.OCX : Windows Common Controls-2 6.0)
- MonthView コントロール → System.Windows.Forms.MonthCalendar クラス
- FlatScrollBar コントロール → System.Windows.Forms.VScrollBar および HScrollBar クラス
- Animation, UpDown コントロール → 上記 ComCtl2 の場合と同様
- ComCtl3(COMCT332.OCX : Windows Common Controls-3 6.0)
- CoolBar コントロール → ToolStripCotainer クラスと ToolStrip クラスで代用できないか検討してみて下さい。
- 編集済み 魔界の仮面弁士MVP 2014年9月17日 7:51 VB6版と異なる名前になるコントロールを太字に変更。
- 回答としてマーク student_ 2014年10月10日 4:25
- MSCommLib(MSCOMM32.OCX : Comm Controls 6.0)
-
単なる杞憂かも知れませんが、、、
- GP-IBインタフェースモジュール用WindowsドライバGPC-4301
- GP-IBインタフェースモジュール用ActiveXコンポーネントBPA-0515
- グラフ描写用ActiveXコンポーネントVSA-0601
- 高度演算分析用ActiveXコンポーネントVSA-0602
- ファイル入出力用ActiveXコンポーネントBZA-0404
これらをちょっと調べてみたところ、 "GPC-4301"が Visual C++/C#/Basic 2013でサポートとある以外は、サポート言語が、6.0までとなっています。 VB6のモジュールを排除しようとすると、これらが問題となるように思えますが、大丈夫でしょうか。
全部確認した訳ではありませんが、ダウンロードのリンクも切れているようです。 ちょっと気になりました。
もっとも、"GPC-4301"は、GP-IBアクセスに必須のモジュールですが、その他はユーティリティなので、代替は可能かと。(ただし、自作は結構、大変かと思います)
学生さん(ですね?)とすると、時間も無く大変かと思いますが、その辺の考慮もされた方が良いと思います。- 回答としてマーク 星 睦美 2014年9月29日 7:38
-
質問そのものには詳しい方が答えてくれると思うので、それ以外について
警告の出ている MSComctl というのはVB.NETの一部ではなく、VB 6.0付属モジュールです。Windows Vista、Windows Server 2008、Windows 7、および Windows 8 に対する Visual Basic 6.0 のサポートに関する声明で言及されているmscomctl.ocxのことです。現状ではVB.NETから無理矢理動作させているに過ぎません。今後も研究を続けられるのであれば、そもそもMSComctlを使わずVB.NETのモジュールを使用すべきです。
-
MSCOMCTL は非常に古いコンポーネントです。
脆弱性が見つかるなどのセキュリティ的な事情から「機能しないようにするようにフラグ(Kill Bit)を立てる」といった対策も何度かなされているようなものです。
最新の情報までは追えていませんので、参照設定をやり直すことで回復する可能性もありますし、Kill Bit を消さないと動かないという可能性もあります。セキュリティリスクを抱えてまで古いものを使い続けるよりは、すでに提案のあるとおり、今のタイミングで .NET 標準コントロールに置き換える形で修正を考えた方がよいと、個人的には考えています。
(仮に Kill Bit を外さないと動かない場合、実行環境が脆弱になるし、実行環境ごとにその設定の変更が必要なので作ったアプリを閉じた組織内とはいえ、配るのは大変です)
- 編集済み AzuleanMVP, Moderator 2014年9月15日 15:32
- 回答としてマーク student_ 2014年9月16日 2:29
- 回答としてマークされていない student_ 2014年9月16日 5:32
- 回答としてマーク student_ 2014年12月20日 3:22
-
そもそもMSCOMCTLというものはどのようなことに使われるものなのでしょうか.MSCOMCTLが無くなることでどのような不便性があるのでしょうか.今の時点では,「MSCOMCTLによりvb6特有のコントロールを使用してるから,.NET用のコントロールで代用したら?」という認識をしてます.
MSCOMCTL はタブコントロールなど、VB6 標準では提供されていない、コモンコントロールを提供するカスタムコントロールです。
ほとんどのコントロールは .NET 標準のコントロールでまかなえるはずです。具体的にどのように使われているかはあなた方のソースコードによるので、第三者にはコメントできません。
-
AxInterop.とInterop.のdll,なぜ二種類があるのでしょうか?(セットで使用しているもの?)
別物です。ざっくり言えば、いずれも COM ラッパーですが、AxInterop の方は ActiveX コントロールに対して用意されたものです。
手動で作成する場合は、Interop.*.DLL は「TlbImp.exe」ツールで。AxInterop.*.DLLは「AxImp.exe」ツールを使う事になります。
(ただし通常は、参照設定すると Visual Studio が自動生成してくれますので、そうしたツールを使うことは無いでしょう)ご存知かもしれませんが、COM コンポーネント(ActiveX コンポーネントや、OLE カスタムコントロールなども含まれます)の本体は *.DLL や *.OCX です。
また、それらのファイルの「型」情報のみを抜き出した *.TLB や *.OLB といったタイプライブラリ、あるいはそのキャッシュである *.OCA が参照されることもあります。これらを .NET から利用する場合、COM ラッパーが必要になります。その利用には:
- 自動生成される Interop Assembly(相互運用機能アセンブリ)のラッパーDLL を参照して使う。
- Primary Interop Assembly(プライマリ相互運用機能アセンブリ)のラッパーDLL を参照して使う。
- ラッパーDLLを別途用意せず、それに相当する型情報をEXE 内に埋め込んで使う。
今回の Interop.*.DLL は (1) に相当します。Interop Assembly ゆえのファイル名ですね。
なお、実際にはファイル名自体に意味は無いため、Interop.*.DLL 以外のファイル名にしても動作します。(2) の PIA は、(1) の IA と同じものです。ただし、自動作成されたものではなく、あらかじめ厳密名をつけて管理される代物であるというのみが異なります。
これは、GAC 上に事前にインストールしておく必要があります。(3) の場合は、COM の型情報を EXE 内で再定義した状態です。この場合、COM ラッパーDLL を配布する必要がなくなるのが利点です。
もちろん、呼び出し先の COM コンポーネント本体(DLL や OCX)は必要ですけれどね。なお、EXE 内に COM の型情報を手動でコーディングしていくことは大変なので、(3)を自動的に行う機能が Visual Studio 2010 以降で追加されました。
VB2010 のソリューション エクスプローラーで、[参照設定]の枝を見てみると、各アセンブリに対して「相互運用型の埋め込み」というプロパティが用意されているかと思います(Embed Interop Types)。
これが、最初の質問のメッセージにある『'相互運用機能型の埋め込み' プロパティ』に繋がってくるわけです。'Interop.MSComDlg' からの間接的な参照が原因で、埋め込まれた相互運用機能アセンブリ 'stdole' に対して参照が作成されました。両方のアセンブリで '相互運用機能型の埋め込み' プロパティを変更することを検討してください。
COM コンポーネントは、内部で更に、別の COM コンポーネントを呼び出す事がありますが、それが「相互運用機能型の埋め込み」を行ったことで競合を起こしたということを表す警告です。
たとえば、'stdole' に対する参照では「相互運用機能型の埋め込み」を True にしておき、それを呼び出している MSComDlg の参照は False にしておくと、このメッセージが出力されますね。
これの解決策としては――
- stdole や MSComDlg に頼らずに済むよう、各種 ActiveX コンポーネントを .NET のクラスに差し替える。
- stdole の「相互運用機能型の埋め込み」を False にして、型が埋め込まれないようにする。
- stdole を参照している他のすべてのアセンブリに対して、「相互運用機能型の埋め込み」を True にする。
――となるわけですが、基本的には既に指摘されているよう、VB6時代のコンポーネントから、.NET 用のものへと置き換えていくべきでしょう。
- 回答としてマーク student_ 2014年10月10日 4:25
すべての返信
-
質問そのものには詳しい方が答えてくれると思うので、それ以外について
警告の出ている MSComctl というのはVB.NETの一部ではなく、VB 6.0付属モジュールです。Windows Vista、Windows Server 2008、Windows 7、および Windows 8 に対する Visual Basic 6.0 のサポートに関する声明で言及されているmscomctl.ocxのことです。現状ではVB.NETから無理矢理動作させているに過ぎません。今後も研究を続けられるのであれば、そもそもMSComctlを使わずVB.NETのモジュールを使用すべきです。
-
>現状ではVB.NETから無理矢理動作させているに過ぎません。
そうでしたか.
現状をもう少し説明しますと,このシステムの開発には過去に3人の先輩が関わっています.1人目と2人目の先輩はVB6にてこのシステムを仕上げてくれました.3人目の先輩はVB6から.NETへの移行を行ってくれました.その際VB6のプログラムに基づき必要な箇所だけを修正したために,MSComctlを使い続けていたのだろうと思います.
確かに今後のためにも修正すべきですね.貴重な情報ありがとうございます.このヒントを基に自分でも調べてみます.
この質問をご覧の方で,具体的な対処法をご存知の方は引き続きご協力お願いします.
-
マルチポストのようですので、そちらの URL を貼って置きます。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=73344
質問者さん>上の URL の投稿は質問者さんと同一人物ですよね?(違ってたら失礼しました)
マルチポストという言葉をご存知でしょうか? そしてそれが決して歓迎されないということはご存知でしょうか?
- 編集済み SurferOnWww 2014年9月15日 7:23 誤字訂正
-
MSCOMCTL は非常に古いコンポーネントです。
脆弱性が見つかるなどのセキュリティ的な事情から「機能しないようにするようにフラグ(Kill Bit)を立てる」といった対策も何度かなされているようなものです。
最新の情報までは追えていませんので、参照設定をやり直すことで回復する可能性もありますし、Kill Bit を消さないと動かないという可能性もあります。セキュリティリスクを抱えてまで古いものを使い続けるよりは、すでに提案のあるとおり、今のタイミングで .NET 標準コントロールに置き換える形で修正を考えた方がよいと、個人的には考えています。
(仮に Kill Bit を外さないと動かない場合、実行環境が脆弱になるし、実行環境ごとにその設定の変更が必要なので作ったアプリを閉じた組織内とはいえ、配るのは大変です)
- 編集済み AzuleanMVP, Moderator 2014年9月15日 15:32
- 回答としてマーク student_ 2014年9月16日 2:29
- 回答としてマークされていない student_ 2014年9月16日 5:32
- 回答としてマーク student_ 2014年12月20日 3:22
-
Azuleanさん>
回答ありがとうございます.
これまでの話しによると,現在使用しているMSCOMCTLというものはVB6で使われていたものであり,.NET用のものを使うべきだということですね.お2人のおっしゃるとおり,今後のことも考えて.NET標準コントロールへの置き換えを行おうと思います.
置き換えをするにあたり知識がまだ乏しいもので教えていただきたいのですが,
そもそもMSCOMCTLというものはどのようなことに使われるものなのでしょうか.MSCOMCTLが無くなることでどのような不便性があるのでしょうか.今の時点では,「MSCOMCTLによりvb6特有のコントロールを使用してるから,.NET用のコントロールで代用したら?」という認識をしてます.
よろしくお願いします.
-
そもそもMSCOMCTLというものはどのようなことに使われるものなのでしょうか.MSCOMCTLが無くなることでどのような不便性があるのでしょうか.今の時点では,「MSCOMCTLによりvb6特有のコントロールを使用してるから,.NET用のコントロールで代用したら?」という認識をしてます.
MSCOMCTL はタブコントロールなど、VB6 標準では提供されていない、コモンコントロールを提供するカスタムコントロールです。
ほとんどのコントロールは .NET 標準のコントロールでまかなえるはずです。具体的にどのように使われているかはあなた方のソースコードによるので、第三者にはコメントできません。
-
外部からインストールしたものに以下のものがあります。早い段階で知らせるべきだったかもしれませんが。
- GP-IBインタフェースモジュール用WindowsドライバGPC-4301
- GP-IBインタフェースモジュール用ActiveXコンポーネントBPA-0515
- グラフ描写用ActiveXコンポーネントVSA-0601
- 高度演算分析用ActiveXコンポーネントVSA-0602
- ファイル入出力用ActiveXコンポーネントBZA-0404
- MSComm Control 6.0
MSComm Control 6.0が良くないのですね。合ってますでしょうか?
確かに今のシステムでタブコントロールを使用してます。他にも使用しているかもしれません。前任の先輩が以前のVB6.0のシステムに沿うようにインストールしたのだと思いますが。
これからMSCOMCTLに関するコントロールを取り除いてみようと思います。
-
MSComctlLib だけでなく、もう一方の MSComDlg も置き換えが必要です。
MSComDlg は、CommonDialog コントロールの ActiveX コンポーネントです。
これは、OS 標準の「コモン ダイアログ」の画面を呼び出すために使われます。
(表示される画面は、実行する OS によって、多少異なるレイアウトになります)まず、この CommonDialog というものは、
1: [ファイルを開く] を表示
2: [ファイル名を付けて保存] を表示
3: [色の設定] を表示
4: [フォントの指定] を表示
5: [印刷] を表示
6: [ヘルプ] を起動
という、最大で 6 種の画面を呼び出す機能を持っています。
VB2 以降では、CommonDialog の「Action プロパティ」に
これらの数字を代入することで呼び出します。
VB4 以降では、それぞれの機能が
1: ShowOpen メソッド
2: ShowShowSave メソッド
3: ShowColor メソッド
4: ShowFont メソッド
5: ShowPrinter メソッド
6: ShowHelp メソッド
という異なるメソッドの呼び出しに割り当てられています。
そして .NET においては、CommonDialog に相当する機能が、
異なるクラスに割り当てられています。
(いずれのクラスも System.Windows.Forms 名前空間にあります)1: OpenFileDialog クラスの ShowDialog メソッド
2: SaveFileDialog クラスの ShowDialog メソッド
3: ColorDialog クラスの ShowDialog メソッド
4: FontDialog クラスの ShowDialog メソッド
5: PrintDialog クラスの ShowDialog メソッド
6: Help クラスの ShowHelp 共有メソッド
元のソースが、CommonDialog をどのように呼び出しているかを
調査した上で、適宜、これらのクラスに差し替えてみてください。
(具体的な使い方は、ネット上などで簡単に見つかるはずです)※注記※
1~5 番は、機能面での互換性がありますが、6 番は非互換です。CommonDialog のヘルプ起動は、「WinHelp」や「WinHlp32」と
呼ばれる、*.hlp ファイルのためのものです(Windows Vista にて廃止)。一方、Help クラスが扱うのは、HTML Help とよばれる
別形式のヘルプファイルです(*.chmファイル、または HTML ヘルプ)。- 回答としてマーク 星 睦美 2014年9月29日 7:37
-
魔界の仮面弁士さん>
分かりやすい説明ありがとうございます.助かります.
そうでしたか.MSComDlgも変更すべきなのですね.
- Microsoft Comm Control 6.0(SP6) --AxInterop.MSCommLib.dllを参照のもの
- Microsoft Comm Control 6.0(SP6) --Interop.MSCommLib.dllを参照のもの
- Microsoft Common Dialog Control 6.0(SP6) --AxInterop.MSComDlg.dllを参照のもの
- Microsoft Common Dialog Control 6.0(SP6) --Interop.MSComDlg.dllを参照のもの
参照タブを確認したところ上記の参照名がありました.MSComDlgを使わないほうが良いということは分かったのですが,AxInterop.とInterop.のdll,なぜ二種類があるのでしょうか?(セットで使用しているもの?)違いは何でしょうか?ちなみにエラーに表示されているのは'Interop.MSComDlg' の方でした.
よろしくお願いします.
- 編集済み student_ 2014年9月17日 7:49
-
MSComm Control 6.0が良くないのですね。合ってますでしょうか?
確かに置き換えは必要ですが、それは別のコントロールです。
MSComm とは、コミュニケーション コントロールとも呼ばれており、
シリアルポート(RS-232C)を通じて通信を行うためのものです。「MSComDlg」「MSCommLib」「ComctlLib」「MSComctlLib」「ComCtl2」「MSComCtl2」「ComCtl3」……名前が似たものが多いのでご注意を!
以下に、置き換え後のクラス名を列挙しておきます。
- MSCommLib(MSCOMM32.OCX : Comm Controls 6.0)
- MSComm コントロール → System.IO.Ports.SerialPort クラス
- MSComDlg(COMDL32.OCX : Common Dialog Controls 6.0)
- CommonDialog クラス → 機能ごとに呼び出すクラスが変わります。先の回答を参照して下さい。
- ComctlLib(COMCTL32.OCX : Windows Common Controls 5.0)
- TabStrip コントロール → System.Windows.Forms.TabControl クラス
- Toolbar コントロール → System.Windows.Forms.ToolStrip クラス
- StatusBar コントロール → System.Windows.Forms.StatusStrip クラス
- ProgressBar コントロール → System.Windows.Forms.ProgressBar クラス
- TreeView コントロール → System.Windows.Forms.TreeView クラス
- ListView コントロール → System.Windows.Forms.ListView クラス
- ImageList コントロール → System.Windows.Forms.ImageList クラス
- Slider コントロール → System.Windows.Forms.TrackBar クラス
- MSComctlLib(MSCOMCTL.OCX : Windows Common Controls 6.0)
- ImageCombo コントロール → ComboBox の DrawItem イベントで代用してみてください。
- TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListView, ImageList, Slider コントロール → 上記 ComctlLib の場合と同様です。
- ComCtl2(COMCT232.OCX : Windows Common Controls-2 5.0)
- Animation コントロール → 同等機能はありません。*.avi の代わりに、*.gif を PictureBox で表示するなどで回避してみてください。
- UpDown コントロール → 同等機能はありません。DomainUpDown や NumericUpDown クラスで代用できないか検討して下さい。
- MSComCtl2(MSCOMCT2.OCX : Windows Common Controls-2 6.0)
- MonthView コントロール → System.Windows.Forms.MonthCalendar クラス
- FlatScrollBar コントロール → System.Windows.Forms.VScrollBar および HScrollBar クラス
- Animation, UpDown コントロール → 上記 ComCtl2 の場合と同様
- ComCtl3(COMCT332.OCX : Windows Common Controls-3 6.0)
- CoolBar コントロール → ToolStripCotainer クラスと ToolStrip クラスで代用できないか検討してみて下さい。
- 編集済み 魔界の仮面弁士MVP 2014年9月17日 7:51 VB6版と異なる名前になるコントロールを太字に変更。
- 回答としてマーク student_ 2014年10月10日 4:25
- MSCommLib(MSCOMM32.OCX : Comm Controls 6.0)
-
AxInterop.とInterop.のdll,なぜ二種類があるのでしょうか?(セットで使用しているもの?)
別物です。ざっくり言えば、いずれも COM ラッパーですが、AxInterop の方は ActiveX コントロールに対して用意されたものです。
手動で作成する場合は、Interop.*.DLL は「TlbImp.exe」ツールで。AxInterop.*.DLLは「AxImp.exe」ツールを使う事になります。
(ただし通常は、参照設定すると Visual Studio が自動生成してくれますので、そうしたツールを使うことは無いでしょう)ご存知かもしれませんが、COM コンポーネント(ActiveX コンポーネントや、OLE カスタムコントロールなども含まれます)の本体は *.DLL や *.OCX です。
また、それらのファイルの「型」情報のみを抜き出した *.TLB や *.OLB といったタイプライブラリ、あるいはそのキャッシュである *.OCA が参照されることもあります。これらを .NET から利用する場合、COM ラッパーが必要になります。その利用には:
- 自動生成される Interop Assembly(相互運用機能アセンブリ)のラッパーDLL を参照して使う。
- Primary Interop Assembly(プライマリ相互運用機能アセンブリ)のラッパーDLL を参照して使う。
- ラッパーDLLを別途用意せず、それに相当する型情報をEXE 内に埋め込んで使う。
今回の Interop.*.DLL は (1) に相当します。Interop Assembly ゆえのファイル名ですね。
なお、実際にはファイル名自体に意味は無いため、Interop.*.DLL 以外のファイル名にしても動作します。(2) の PIA は、(1) の IA と同じものです。ただし、自動作成されたものではなく、あらかじめ厳密名をつけて管理される代物であるというのみが異なります。
これは、GAC 上に事前にインストールしておく必要があります。(3) の場合は、COM の型情報を EXE 内で再定義した状態です。この場合、COM ラッパーDLL を配布する必要がなくなるのが利点です。
もちろん、呼び出し先の COM コンポーネント本体(DLL や OCX)は必要ですけれどね。なお、EXE 内に COM の型情報を手動でコーディングしていくことは大変なので、(3)を自動的に行う機能が Visual Studio 2010 以降で追加されました。
VB2010 のソリューション エクスプローラーで、[参照設定]の枝を見てみると、各アセンブリに対して「相互運用型の埋め込み」というプロパティが用意されているかと思います(Embed Interop Types)。
これが、最初の質問のメッセージにある『'相互運用機能型の埋め込み' プロパティ』に繋がってくるわけです。'Interop.MSComDlg' からの間接的な参照が原因で、埋め込まれた相互運用機能アセンブリ 'stdole' に対して参照が作成されました。両方のアセンブリで '相互運用機能型の埋め込み' プロパティを変更することを検討してください。
COM コンポーネントは、内部で更に、別の COM コンポーネントを呼び出す事がありますが、それが「相互運用機能型の埋め込み」を行ったことで競合を起こしたということを表す警告です。
たとえば、'stdole' に対する参照では「相互運用機能型の埋め込み」を True にしておき、それを呼び出している MSComDlg の参照は False にしておくと、このメッセージが出力されますね。
これの解決策としては――
- stdole や MSComDlg に頼らずに済むよう、各種 ActiveX コンポーネントを .NET のクラスに差し替える。
- stdole の「相互運用機能型の埋め込み」を False にして、型が埋め込まれないようにする。
- stdole を参照している他のすべてのアセンブリに対して、「相互運用機能型の埋め込み」を True にする。
――となるわけですが、基本的には既に指摘されているよう、VB6時代のコンポーネントから、.NET 用のものへと置き換えていくべきでしょう。
- 回答としてマーク student_ 2014年10月10日 4:25
-
魔界の仮面弁士さん>
上記2件の回答、本当にありがとうございます。まさに今知りたい内容でした。
参照タブを見直したら、上記回答の「置き換え後のクラス名を列挙」の項目1~5と同様のものがありました。これらを使わないようにしなければならないのですね。似たような名前が多く混同していましたが、それぞれ違ったのですね。エラーに対する具体的な説明もありがとうございます。エラーの意味が分かってきました。
.NET用のものに置き換えるとすると、現在使用中のMSCommLib、MSComDlg、ComctlLib、MSComctlLib、ComCtl2の参照は使わなくてよい(削除してよい)のでしょうか?
また、もしプロジェクトを新規作成した場合は(最初から作り直す場合は)、上記のような参照の設定をわざわざする必要はなく、そのまま指摘の通り.NET用のコントロールで代用して使用していけばよいということでしょうか。
(人のプログラムを途中から改良していくというやり方はあまり好きではなく、いっそのこと最初からプログラムを作り直そうかと考えているしだいであります。もちろん.NET用のものを使用するということに注意して。)
-
単なる杞憂かも知れませんが、、、
- GP-IBインタフェースモジュール用WindowsドライバGPC-4301
- GP-IBインタフェースモジュール用ActiveXコンポーネントBPA-0515
- グラフ描写用ActiveXコンポーネントVSA-0601
- 高度演算分析用ActiveXコンポーネントVSA-0602
- ファイル入出力用ActiveXコンポーネントBZA-0404
これらをちょっと調べてみたところ、 "GPC-4301"が Visual C++/C#/Basic 2013でサポートとある以外は、サポート言語が、6.0までとなっています。 VB6のモジュールを排除しようとすると、これらが問題となるように思えますが、大丈夫でしょうか。
全部確認した訳ではありませんが、ダウンロードのリンクも切れているようです。 ちょっと気になりました。
もっとも、"GPC-4301"は、GP-IBアクセスに必須のモジュールですが、その他はユーティリティなので、代替は可能かと。(ただし、自作は結構、大変かと思います)
学生さん(ですね?)とすると、時間も無く大変かと思いますが、その辺の考慮もされた方が良いと思います。- 回答としてマーク 星 睦美 2014年9月29日 7:38
-
pepperleaf01さん>
回答ありがとうございます。はい、学生です。
上記回答をいただいてから自分でも調べてみました。確かにGPC-4301以外の4点はサポートがVB6.0で終了していました。今後測定で長期に渡って使用していくことを考えると、この部分も排除が必要になりますね。計画に加えようと思います。
このシステムの開発はVB6.0のサポートが終了してから移行が必要だったことは分かっていたみたいなのですが、なかなかどの学生も手が出せず、10年ほど経ってようやく去年の先輩が取りかかりました。大部分の移行は終わっていて、私の認識では少し手を加える程度と考えていたのですが、ここまで修正点があるとガラリと状況が変わりそうですね。
先生も測定のためにシステムを必要としているみたいで、なんとか作成しなければなりません。卒業までの残り半年という短い期間なのでどこまで進められるかは分かりませんが、今後の長期使用を考えて一つ一つ.NET用にしていきたいと思います。