• 締切済み

C#で参照したCOMコンポーネントが動作しない

VS.NETのVisualC#でアプリケーションの開発を行っているのですが、あるCOMコンポーネント「A」を参照して、その中のメソッドを動作させようとするとFileNotFoundExceptionが発生し、「ファイル名またはアセンブリ名A、またはその依存関係の1つが見つかりませんでした。」というメッセージが出力されてしまいます。「A」は別のCOMコンポーネント「B」を参照していますが、「B」は管理ツールのコンポーネントサービスに登録済みです。なおtlbimpを使用して厳密名はつけてあります。 C#に詳しいかた、いらっしゃいましたらよろしくお願いします。

みんなの回答

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

VB6かExcelVBAで動くかをためしてみれば?

counter_class
質問者

補足

回答ありがとうございます。 問題は無事解決しました。 VB6で動作することは確認済みでした。 COMコンポーネントAからtlbimpで作成した .NETコンポーネントA'は アセンブリキャッシュに登録していたのですが、 元のCOMコンポーネントAをコンポーネントサービスに 登録していませんでした。 作成されたA'がAの内容を全て引き継いだ .NETコンポーネントになると勘違いしていたため 発生したエラーでした。

関連するQ&A

  • COMコンポーネントファイルが参照できない。

    現在VisualBasic2010expressを使っています。 オーディオの録音用プログラムを作りたいと思い とあるホームページからwave入出力用のCOMコンポーネントファイル(.ocx)をダウンロードしました。 E:ドライブの「system32」の中に入れVBから「ツール→アイテムの選択→COMコンポーネント→参照」と操作しsystem32に入ってる目的のファイルを探したんですがどこにも見当たりません。 VBではなく普通に「sysytem32」を開いた場合は目的のファイルはきちんと存在します。 またVB上でも「system32」上ではなく「system」のフォルダに置いた場合は参照できます。 なぜ「system32」上だと参照できないんでしょうか? 読み取り専用、隠れファイル等もチェックを外してみたのですが変わりませんでした。 VBでファイル名を示し実行した場合は「そのファイルは存在しません」となります 使用しているOSはWindows8です。8が原因何でしょうか? 初歩的な質問で申し訳ありません。

  • C#.NETでのCOMコンポーネント作成方法

    お願いします。 C#.NET2003で、時間を表示する極簡単なユーザコントロールを作成しました。 そのユーザコントロールは、同じソリューションの中でTestアプリケーションを 作成し、参照設定で「参照の追加」-「プロジェクト」タブで追加することにより、 ツールボックスのマイユーザコントロール上に表示され、Testフォームに貼り 付けることが出来、正常に動作しました。 ここまではいいのですが、このユーザコントロールを誰でも使えるようにしようと、 以下を実行しました。 (1) 構成プロパティの「COMの相互運用機能に登録」を「True」に変更。 (2) sn.exe -k コマンドにより、.snkファイルを作成。 (3) ユーザコントロールのAssemblyInfo.csを2行修正。 [assembly: AssemblyVersion("1.0.0.1")] [assembly: AssemblyKeyFile("..\\..\\SimpleUserControl.snk")] (4) ソリューションをリビルド。 (5) リビルドしたDLLファイルをC:\Windows\assemblyフォルダにコピー。 このようにして、新しいプロジェクトを作成し、「参照の追加」のCOM タブを見ると、ちゃんとユーザコントロールが見えるのですが、追加 しようとすると、以下のエラーが発生しました。 ============================================================= 'SimpleUserControl'への参照を追加できませんでした。 タイプライブラリを.NETアセンブリに変換できませんでした。 タイプライブラリSimpleUserControlはCLRアセンブリからエクスポートされた ため、CLRアセンブリとして再度インポートすることはできません。 ============================================================= 何か手順が抜けているの思うのですが、どなたかご教示頂けないで しょうか?

  • COMコンポーネントの構造の本質的理解ができない

    プログラミングを始めて間もない初心者です。 windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。 rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。 >COM ではインスタンスを生成するときに「COM コンポーネント」を指 >定するための ProgID を引数として WIN32OLE.new メソッドを実行し >ます。 COM コンポーネントとは、Windows に登録された、ある機能 >(たとえば、IE や MS Office の制御機能) を提供するためのもので >す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する >ことができます。 この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application") によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。 これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。 たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。 (初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします) このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。 質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。

    • ベストアンサー
    • Ruby
  • C#のインスタンスを参照渡ししたい

    メインのクラスAにウェブブラウザAがあります。 クラス A { メソッドA(){  ウェブブラウザA.Navigate(URL); } メソッドC(){  MessageBox.Show("これは成功"); } } クラス B {  メソッドB(ウェブブラウザA){   ウェブブラウザA.Navigate(URL);//成功  } A a = new A(); a.メソッドA();//失敗 a.メソッドC();//成功 } このようなプログラムを作っています。 クラスBをインスタンスして実行すると クラスBのメソッドBは成功しますが、クラスAの方で宣言しているa.メソッドAは失敗します しかし、a.メソッドC();は成功します。 これは、a.メソッドAは、その上のA a = new A();でつくられた新しいインスタンスのなかで処理がされていて起動時につくられたクラスAのインスタンスとは別のものになっているからだと思うのですが、まちがいないでしょうか? この処理を成功させたい場合、起動時に作られたクラスAのインスタンスをメソッドBの引数に参照渡しですれば、  メソッドB(ウェブブラウザA){   ウェブブラウザA.Navigate(URL);//成功   メソッドA();  } も可能なのではないかと考えているのですが、可能でしょうか?またそのインスタンスを引数にする方法はどのようなものでしょうか? ちなみに、クラスBはDLLに置いてあり、メソッドAは複数のDLLで使うので毎度書くのは面倒なのでクラスAの中で呼び出して使いたいと考えています。

  • VS2005、C#、Excel2002でExcelの操作

    現在、開発環境が、 WinXP VS2005 Excel2002 なのですが、VS2005の参照の追加で、 Microsoft Excel 10.0 Object Library を追加すると、参照設定の「Excel」にビックリマークが出て、 「タイプライブラリ"Excel"のラッパーアセンブリが見つかりません。」と、 「参照コンポーネント'Excel'が見つかりませんでした。」 の2つの警告が出て、Excel操作の記述が書けません。 ちなみに、参照設定「Excel」のプロパティを見ると、パスが空になっています。 この状況で、C#でExcelを操作できるようにするにはどうしたらよいかご教授いただければ幸いですm(_ _)m

  • Mac用画像処理コンポーネント

    現在、Windows用の画像処理アプリケーションをGrapeCityのLEADTOOLSを使用して開発しています。 今後、同様のアプリケーションのMac版を作成しなければいけなくなったのですが、Macの開発ツールに対応している、画像処理のコンポーネントの情報が見つかりません。 Macに対応している、画像処理コンポーネントをご存知の方、情報をいただけないでしょうか。

  • VB6で作成したCOMに厳密名を与える

    VS.NET上でVB6で作成したCOMを使用しようとしたのですが、ビルドを行った際に「アセンブリの生成に失敗しました--参照されたアセンブリ'XXX.xxx'は厳密な名前を持っていません」というエラーが発生してしまいます。 VS.NET上でCOMを使用する場合には自動的にRCWにより適切な形に変換されるという記述を読んだ気がするのですが、別に厳密名を与える処理を行わなくてはいけないのでしょうか。 .NET初心者のため情報が足りないかも知れないのですが、よろしくお願いします。

  • Visaul Studioでのデバッグ(COMコンポーネントのデバッグ方法)

    お世話になります。 今、VC++でATLのCOMプログラムをしていますが、 デバッグ方法がわかりません。コンパイルして、実行は、.htmファイルを開くため、C言語などのようにprintf()などで値を見たり、デバッガなどが起動してもブレイクポイントが?になります。 そこで少し調べたところ、MSDNに記載されていました。 http://msdn2.microsoft.com/ja-jp/library/ya4xb00s(VS.80).aspx Visual StudioでのCOMコンポーネントのデバッグ設定方法についてです。 の手順3.eのCOMコンポーネントノードとはどれをさすのでしょうか? COM+アプリケーションふぉるだを開くと COM+ Explorer COM+ QC Dead LetterQueue Listener COM+ Utilities などがあります。 よろしくお願いいたします。

  • KeyListenerをButtonコンポーネントに追加

    ある問題集の問題なのですが、 どういうことなのかほとんどわかりません・・・ 問.KeyListenerをButtonコンポーネントに追加する際の説明として正しいのはどれですか。 a.キーイベントとマウスクリックイベントを有効にするためには、ButtonオブジェクトのenablEvents()メソッドを呼び出して定義をわたさなければならない。(×) b.ButtonオブジェクトのenableEvents()メソッドを呼び出し、定数AWTEvent.KEY_EVENT_MASKを渡さなければならない。(×) 解説.addkeyListener()メソッドはCompornentクラスに含まれているので、すべてのAWTコンポーネントにKeylistenerを追加することができます。したがって、選択肢a,bは間違いです。 ということなんですが、解説を読んでもよくわかりません。 もう少しわかりやすく教えてください。

    • ベストアンサー
    • Java
  • c++でのヘッダーファイルの循環参照

     c++言語においての質問です.  A, Bという二つのクラスを作ったとします.  宣言は.h,実装は.cppで行っています. 【A.h】 class A{ //内容 public: B ConvertB(); }; 【B.h】 class B{ //内容 public: A ConvertA(); };  上のように,クラスAではクラスBを返すメソッド. クラスBではクラスAを返すメソッドを実装したいとします.  しかし,単純に 【A.h】に #include "B.h" 【B.h】に #include "A.h" などとすると当然循環参照になってエラーになりますよね? ...とは言っても, 【A.cpp】や【B.cpp】にインクルードした所で, ヘッダ側でエラーが起きてしまいます.  そこで,私の場合は... 【A.h】の先頭に class B{ConvertAで用いるメソッド}; 【B.h】の先頭に class A{ConvertBで用いるメソッド};  というようにする事でなんとかエラーを避けています.    ...しかし,この方法ではAやBのクラスの定義を修正する場合に, 2つのファイルのヘッダを書き換えなければならなくなります. A, B, C, D...などとクラスが増えていくと, 一つのヘッダーファイルに4つも5つもクラスの定義を書かなければなりませんし, クラスのメソッドの定義を一つ変えようとしただけでも, 複数のヘッダの内容をいじらないといけません.  非常に読みにくいコードになってしまうのです.  そこで,もう少しスマートに実現する方法は無いでしょうか?  JavaやC#を使えば簡単に解決するのですが...ライブラリの関係でC++を使わなければ ならないのです.  もしくは,このような相互変換?のクラスを作る場合はみなさんはどのようにして ヘッダーファイルの循環参照を避けているのでしょうか?  例えば様々な形式の色空間のクラスなどだったら... RGBクラス YCrCbクラス HSVクラス ...など  このようなクラスを作った後で,RGBをYCrCbに変換出来るようにしたり, その逆へも変換出来るようにしたいのです.  それともこのような変換が出来るクラスを作る事は間違っているのでしょうか?    よろしくお願いします.

専門家に質問してみよう