none
クラスライブラリをCOMに? RRS feed

  • 質問

  • 度々お世話になっております、

    C#や.NETを使い始めて、まだ累計数日の超初心者です。。

     

    とりあえず、C#でクラスライブラリを作りました。

    (正確には、一旦アプリとして作った一部のクラスを、クラスライブラリのテンプレートで作ったプロジェクトに貼り付けただけ)

    できあがったDLLは、参照設定に追加すると新規プロジェクトの中でも使えるのですが・・・

     

    これをVB6で使うには、どうしたらいいですか?

    VB6上の参照設定でこのDLLを追加しようとすると、参照設定できません、というようなエラーになってしまいます。

    VBの技術者からは、COMじゃないとダメなのではないか?といわれたのですが・・・

     

    そもそも、COMって、COMポート?な人間なので、ちんぷんかんぷんですorz

    MSDNでCOMやクラスライブラリというようなキーワードで検索すると、

    それらしいものはちらほら見つかるのですが、具体的にどうしたらいいかよくわかりません。

    (そもそも、アセンブリとかインタフェースとか、基本用語がわかっていないという話も・・・)

     

    どうやったらできるのでしょうか?

    そもそもVB6から使うことはできるのでしょうか?

     

    よろしくお願いいたします

     

    2008年5月21日 1:55

回答

  •  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オプションの有無によって挙動は変わります。

     

    2008年5月21日 14:22
    モデレータ

すべての返信

  • regasm.exeでレジストリ登録して、tlbexp.exeでタイプライブラリを作成し、そのタイプライブラリをVB6側で参照設定すれば可能なようですが、実際に作成するなどの確認は行っていません。

    2008年5月21日 2:24
  • あまり詳しくはありませんが参考にしてください。

     

    コマンドラインを使用する場合はビルドされたクラスライブラリのdllに対してtlbexp XX.dll /out:XX.tlb

    のようにしてタイプライブラリを作成したあと、regasm.exeを使用してregasm XX.dll /tlb:XX.tlbのようにコマンドを入力

    してCOMとして登録した後、VB6のプロジェクトの参照設定で参照を追加して使用できるようになったと思います。

     

    VS2005を使っている場合は、IDE上でソリューションエクスプローラ内のクラスライブラリプロジェクトのプロパティを開いて、ビルドタブを選択し、COM相互運用登録をチェックすると、ビルド時にCOMとして登録を行ってくれます。クラスの属性に[ComVisible(true)]を設定するようにしてください。

     

    記憶をたよりに書いているので間違っているかもしれませんが。

    2008年5月21日 2:38
  • 概念としては以下の辺りで、

     

    COM ラッパー
    http://msdn.microsoft.com/ja-jp/library/5dxz80y2.aspx

     

    具体的には以下の辺りでしょう。

     

    COM への .NET Framework コンポーネントの公開
    http://msdn.microsoft.com/ja-jp/library/zsfww439(VS.80).aspx

    2008年5月21日 2:44
    モデレータ
  • 一応、参考になりそうな過去スレッドです。

     

    .NETコンポーネントをCOMコンポーネントとして運用環境への配布

    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=667588&SiteID=7

    2008年5月21日 2:56
  • たくさんのレスありがとうございます。

     

    まず、クラス名の頭に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アセンブリへの参照を追加してください。

     

    となり・・・。

     

    なにがどうなっているのでしょうか・・・。
    2008年5月21日 5:39
  • 整理するために、至極簡単なクラスライブラリを作ってみました。

    使用環境はVC# 2008 Expressです。

     

    まず、プロジェクトの新規作成でクラスライブラリを選び、プロジェクト名をTestLibとして、

     

    Code Snippet

    using 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でしか使えないのでしょうか・・・。

    2008年5月21日 8:05
  • VC#2008で使えないのはメッセージの通りで、.NETアセンブリなんだからCOM経由しちゃダメって事ですね。

     

    Office2000のときですが、これは謎ですね。

    ただ、本件とは無関係だと思いますが、Office2000のVB6というものは存在しないです。Office2000のはVBAですね。

     

    2008年5月21日 10:26
  •  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オプションの有無によって挙動は変わります。

     

    2008年5月21日 14:22
    モデレータ
  • 念のため。

     

    ・.NET 1.0/1.1アプリケーションから使うことはできないと認識するべき。

    ・.NET 1.0/1.1で作られたDLLが読み込まれるプロセスから使われることも避けるべきです。

    ・シェル拡張に使ってはならない。

     

    #CLRのバージョン問題なんてあまり考えたくない…。

    2008年5月21日 14:36
    モデレータ
  • なるほど!

    だいぶすっきりしてまいりました。

     

     Azulean さんからの引用

    .NETタブからそのDLLを直接参照して下さい。

    基本的にCOMとして使うことはしません。

     

    そう言ってくれればわかるのに、なんてわかりづらいエラーメッセージ。。(^^;;

     

     Azulean さんからの引用

    CRTかパスか何だろう…。

    管理ツールのイベントログあたりに何か残ってたりしないかなぁ…。

     

    イベントログには特に出ていないようです。

    これが出来ないとちょっと困るので、

    もう少し試行錯誤してみます。

    (Officeのバージョンを上げれば解決する、というような問題なら良いですが・・・)

     

     Azulean さんからの引用

    ところで、なぜSystem32にコピーするんですか?

    昔はDLLをSystem(System32)にコピーするのが一般的なこともありましたが、最近はそんなことありません。

    また、レジストリにCOMの登録情報があるということは、どこにそのDLLがあるかという情報が含まれています。そのため、System32にコピーするという選択肢の意図するところがよく分かりません。

     

    COMの情報というと、ボーレートとかストップビットとか・・・(違

    というような人間ですもので(^^;
    DLLのパスもレジストリに登録されるから、どこに置いても構わないのですね。勉強になりましたm(__)m

     

    ありがとうございました!
    2008年5月22日 0:48