トップ回答者
クラスライブラリをCOMに?

質問
-
度々お世話になっております、
C#や.NETを使い始めて、まだ累計数日の超初心者です。。
とりあえず、C#でクラスライブラリを作りました。
(正確には、一旦アプリとして作った一部のクラスを、クラスライブラリのテンプレートで作ったプロジェクトに貼り付けただけ)
できあがったDLLは、参照設定に追加すると新規プロジェクトの中でも使えるのですが・・・
これをVB6で使うには、どうしたらいいですか?
VB6上の参照設定でこのDLLを追加しようとすると、参照設定できません、というようなエラーになってしまいます。
VBの技術者からは、COMじゃないとダメなのではないか?といわれたのですが・・・
そもそも、COMって、COMポート?な人間なので、ちんぷんかんぷんですorz
MSDNでCOMやクラスライブラリというようなキーワードで検索すると、
それらしいものはちらほら見つかるのですが、具体的にどうしたらいいかよくわかりません。
(そもそも、アセンブリとかインタフェースとか、基本用語がわかっていないという話も・・・)
どうやったらできるのでしょうか?
そもそもVB6から使うことはできるのでしょうか?
よろしくお願いいたします
回答
-
YAMAMAYA さんからの引用 'TestLibへの参照を追加できませんでした。
ActiveXタイプライブラリ'c:\windows\system32\TestLib.tld'が.NETアセンブリからエクスポーとされましたが、参照として追加できません。.NETアセンブリへの参照を追加してください。
.NETタブからそのDLLを直接参照して下さい。
基本的にCOMとして使うことはしません。
YAMAMAYA さんからの引用 Office2000のVB6で参照設定すると、実行時にエラー。
CLRの問題かパスか何だろう…。(CRTとか書いていましたので訂正します)
管理ツールのイベントログあたりに何か残ってたりしないかなぁ…。
YAMAMAYA さんからの引用 ビルドして、できあがった TestLib.dll を c:\windows\system32 にコピーし、regasmを実行
ところで、なぜSystem32にコピーするんですか?
昔はDLLをSystem(System32)にコピーするのが一般的なこともありましたが、最近はそんなことありません。
また、レジストリにCOMの登録情報があるということは、どこにそのDLLがあるかという情報が含まれています。そのため、System32にコピーするという選択肢の意図するところがよく分かりません。
※regasmコマンドの/codebaseオプションの有無によって挙動は変わります。
すべての返信
-
あまり詳しくはありませんが参考にしてください。
コマンドラインを使用する場合はビルドされたクラスライブラリのdllに対してtlbexp XX.dll /out:XX.tlb
のようにしてタイプライブラリを作成したあと、regasm.exeを使用してregasm XX.dll /tlb:XX.tlbのようにコマンドを入力
してCOMとして登録した後、VB6のプロジェクトの参照設定で参照を追加して使用できるようになったと思います。
VS2005を使っている場合は、IDE上でソリューションエクスプローラ内のクラスライブラリプロジェクトのプロパティを開いて、ビルドタブを選択し、COM相互運用登録をチェックすると、ビルド時にCOMとして登録を行ってくれます。クラスの属性に[ComVisible(true)]を設定するようにしてください。
記憶をたよりに書いているので間違っているかもしれませんが。
-
概念としては以下の辺りで、
COM ラッパー
http://msdn.microsoft.com/ja-jp/library/5dxz80y2.aspx具体的には以下の辺りでしょう。
COM への .NET Framework コンポーネントの公開
http://msdn.microsoft.com/ja-jp/library/zsfww439(VS.80).aspx -
一応、参考になりそうな過去スレッドです。
.NETコンポーネントをCOMコンポーネントとして運用環境への配布
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=667588&SiteID=7
-
たくさんのレスありがとうございます。
まず、クラス名の頭にIをつけたインタフェースを作り、メソッドを宣言して、
本体のクラスは、そのインタフェースを継承するようにして、
クラスに属性を付けて、
[ClassInterface(ClassInterfaceType.None)]プロジェクトのプロパティで「COM 相互運用機能の登録」をチェックし、
AssemblyInfo.cs の中の設定を変更し、
[assembly: ComVisible( true )]
それから、「厳密な名前付きのアセンブリ」というキーワードが引っかかったので、
プロジェクトのプロパティで「アセンブリの署名」を設定して、リビルドしました。できあがった hogehoge.dll をsystem32の中にコピーして、
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe c:\windows\system32\hogehoge.dll /tlb /codebase
型は正常に登録されました。
アセンブリは 'c:\windows\system32\hogehoge.tlb' にエクスポートされ、タイプ ライブラリは正常に登録されました。system32の中に hogehoge.tlb が出来、
VB6の参照設定で、作成したクラスが表示されるようになり、
Dim obj as New HogeHoge
obj.・・・等と打ち込むと、コード補完(?)も動作するようになりました。
が、実行すると、
オートメーションエラーです。
指定されたファイルが見つかりません。・・・となってしまいます。
試しに、VC#上で新規のプロジェクトを作り、参照の追加で「COM」を選んでみても、一覧には出てくるし、パスも正しいようなのですが、
'hogehoge'への参照を追加できませんでした。
ActiveXタイプライブラリ'c:\windows\system32\hogehoge.tld'が.NETアセンブリからエクスポーとされましたが、参照として追加できません。.NETアセンブリへの参照を追加してください。
となり・・・。
-
整理するために、至極簡単なクラスライブラリを作ってみました。
使用環境はVC# 2008 Expressです。
まず、プロジェクトの新規作成でクラスライブラリを選び、プロジェクト名をTestLibとして、
Code Snippetusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;namespace TestLib {
public interface ITestClass {
int GetValue();
}[ClassInterface( ClassInterfaceType.None )]
public class TestClass : ITestClass {
public int GetValue() {
return 12345;
}
}
}さらに、AssemblyInfo.csを変更
Code Snippet[assembly: ComVisible( true )]プロジェクトのプロパティで署名→アセンブリの署名をON、
新規作成でTestClass.snkを設定。
ビルドして、できあがった TestLib.dll を c:\windows\system32 にコピーし、regasmを実行
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe C:\WINDOWS\System32\TestLib.dll /tlb /codebase
型は正常に登録されました。
アセンブリは 'C:\WINDOWS\System32\TestLib.tlb' にエクスポートされ、タイプ ライブ
ラリは正常に登録されました。VisualStudio6のVB6で参照設定すると、問題なく動作。
Office2000のVB6で参照設定すると、実行時にエラー。
オートメーションエラーです。
指定されたファイルが見つかりません。VC#2008で参照の追加をしようとすると、OKをクリックしたとたんにエラー。
'TestLibへの参照を追加できませんでした。
ActiveXタイプライブラリ'c:\windows\system32\TestLib.tld'が.NETアセンブリからエクスポーとされましたが、参照として追加できません。.NETアセンブリへの参照を追加してください。
なぜ、VisualStudio6でしか使えないのでしょうか・・・。
-
YAMAMAYA さんからの引用 'TestLibへの参照を追加できませんでした。
ActiveXタイプライブラリ'c:\windows\system32\TestLib.tld'が.NETアセンブリからエクスポーとされましたが、参照として追加できません。.NETアセンブリへの参照を追加してください。
.NETタブからそのDLLを直接参照して下さい。
基本的にCOMとして使うことはしません。
YAMAMAYA さんからの引用 Office2000のVB6で参照設定すると、実行時にエラー。
CLRの問題かパスか何だろう…。(CRTとか書いていましたので訂正します)
管理ツールのイベントログあたりに何か残ってたりしないかなぁ…。
YAMAMAYA さんからの引用 ビルドして、できあがった TestLib.dll を c:\windows\system32 にコピーし、regasmを実行
ところで、なぜSystem32にコピーするんですか?
昔はDLLをSystem(System32)にコピーするのが一般的なこともありましたが、最近はそんなことありません。
また、レジストリにCOMの登録情報があるということは、どこにそのDLLがあるかという情報が含まれています。そのため、System32にコピーするという選択肢の意図するところがよく分かりません。
※regasmコマンドの/codebaseオプションの有無によって挙動は変わります。
-
なるほど!
だいぶすっきりしてまいりました。
Azulean さんからの引用 .NETタブからそのDLLを直接参照して下さい。
基本的にCOMとして使うことはしません。
そう言ってくれればわかるのに、なんてわかりづらいエラーメッセージ。。(^^;;
Azulean さんからの引用 CRTかパスか何だろう…。
管理ツールのイベントログあたりに何か残ってたりしないかなぁ…。
イベントログには特に出ていないようです。
これが出来ないとちょっと困るので、
もう少し試行錯誤してみます。
(Officeのバージョンを上げれば解決する、というような問題なら良いですが・・・)
Azulean さんからの引用 ところで、なぜSystem32にコピーするんですか?
昔はDLLをSystem(System32)にコピーするのが一般的なこともありましたが、最近はそんなことありません。
また、レジストリにCOMの登録情報があるということは、どこにそのDLLがあるかという情報が含まれています。そのため、System32にコピーするという選択肢の意図するところがよく分かりません。
COMの情報というと、ボーレートとかストップビットとか・・・(違
というような人間ですもので(^^;
DLLのパスもレジストリに登録されるから、どこに置いても構わないのですね。勉強になりましたm(__)m