C#で作成したDLLをExcelVBAで利用する

このQ&Aのポイント
  • C#で作成したDLLをExcelVBAで利用する方法と、問題が発生した時の解決策について説明します。
  • 開発端末では期待通りに動作するC#で作成したDLLをExcelVBAで利用する方法と、エラーが発生した場合の解決策について説明します。
  • C#で作成したDLLをExcelVBAで利用する際に発生するエラーの解決策と、配布先の端末での設定について説明します。
回答を見る
  • ベストアンサー

C#で作成したDLLをExcelVBAで利用する

C#で作成したDLLをExcelのVBAで利用し、 そのExcelのブックファイルを多人数に配布しようとしています。 開発端末では動作を確認できたのですが、 その他の端末で試してみてもエラーメッセージが表示され動作しません。 下記など、似たような質問がすでにありますが、 解決方法が不明でしたので質問させていただきました。 http://okwave.jp/qa/q2408504.html よろしくお願いします。 ■現象 開発端末では期待通りの文字列が取得できる その他の端末では「Activexコンポーネントはオブジェクトを作成できません」の エラーメッセージが表示される ■開発端末 WindowsXP Pro SP3 Visual Studio Pro 2008 Office Pro 2003 SP3 ■試験端末A WindowsXP Pro SP3 Visual Studio なし Office Pro 2003 SP3 ■試験端末B Windows7 HomePro Visual Studio Pro 2008 Office Pro 2003 SP3 ■C#側プログラム 本来実装したいプログラムは複雑ですが、 下記のように簡略化しても同様のエラーが発生しました。 実際には.NETFrameworkのHttpWebRequestを利用したプログラムになります。 namespace Test { public class TestClass { public string testMessage() { return "テストメッセージ取得"; } } }  1)クラスライブラリで作成  2)プロジェクトのプロパティでCOM出力を指定    アプリケーション⇒アセンブリ情報⇒アセンブリをCOM参照可能にする にチェック    ビルド⇒COM相互運用機能の登録 にチェック  3)インストーラ作成    蛇足かもしれませんが、出来上がったDLL、TLBを試験端末にインストールするため、    インストーラを用意しました。    インストール内容はDLL、TLBとあらかじめVBAスクリプトが記述されたExcelの    ブックファイルです。 ■Excel VBAスクリプト Function vbatest() As String Dim msg As New Test.TestClass vbatest = msg.testMessage() End Function  1)開発端末で実行    期待値「テストメッセージ取得」が表示される。  2)試験端末で実行    インストーラでDLL、TLB、ブックファイルをインストール。    ブックファイルを開き、VBAスクリプトをデバッグしたところ、    「Activexコンポーネントはオブジェクトを作成できません」のエラーメッセージが表示される。     ※セキュリティレベルは中、参照設定でC#で作成したTLBは参照済み。    デバッグ時のカーソルは『msg.testMessage()』のラインで止まっている    また、『Dim msg As New Test.』まで入力すると、『TestClass』が入力候補として    表示されるため、TLBの参照は問題ないと思われる。 ■質問内容 開発環境ではビルド時にCOMの設定が正しく行われているため、期待通りの結果になりましたが、 試験環境ではCOMの設定に相当することができていないため、今回のエラーに至ったと推測しています。 C#で作成したDLLをExcelのVBAで利用し、かつ配布したい場合、 配布先の端末に対してどのような処置が必要でしょうか? .NETFramework以外に同梱が必要なコンポーネントやインストール時に必要な設定などないでしょうか? また、お気づきの点がありましたら合わせてご指摘いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#259269
noname#259269
回答No.2

.NET で作成した COM 対応コンポーネントのレジストリ登録には regasm.exe を利用してください。 regasm.exe /codebase XXX.DLL です。

kooosuke8086
質問者

お礼

お世話になっております。 edp3142様に紹介いただいた、regasm.exe と、 IDii24様に紹介いただいたアセンブリ著名で DLLを利用することができました。 前回補足との違いはExcelブックファイルを作り直したことです。 よって今後の課題は下記となりますが、本件とは趣旨が異なると思いますので、 疑問点が出た際に改めて質問させていただきます。 1) DLLの利用に regasm.exe が必要なため、インストーラーなどにその仕組みを入れる必要がある。 2) regasm.exe の実行にはAdmin権限が必要なため、利用者にその旨を促す。 3) DLLのバージョンが替わると、これまで利用していたブックファイルが利用できない可能性がある。 4) アンインストールの際に regasm.exe で登録した内容をクリーニングする必要がある。 ありがとうございました。

kooosuke8086
質問者

補足

アドバイスありがとうございます。 試験環境で紹介いただたコマンドを実行したところ、下記のようなエラーが表示されました。 -------------------------- C:\Windows\Microsoft.NET\Framework\v4.0.30319>RegAsm.exe /codebase "C:\Program Files\xxxx\Test.dll" Microsoft(R) .NET Framework Assembly Registration Utility 4.0.30319.1 Copyright (C) Microsoft Corporation 1998-2004. All rights reserved. RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録 すると、同じコンピューターにインストールされるその他のアプリケーションとの競合が 生じる可能性があります。/codebase スイッチは署名されたアセンブリのみに使用できま す。アセンブリに厳密な名前を付けて、再登録してください。 RegAsm : error RA0000 : 登録情報をレジストリに書き込み中にエラーが発生しました。 選択されたオプションを使うには、管理者のアクセス許可が必要です。管理者のコマンド プロンプトを使ってこれらのタスクを完了してください。 -------------------------- そこで、IDii24様に紹介いただいた情報を元にアセンブリ著名をつけて、admin権限で実行したところ、登録することができました。 -------------------------- C:\>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /codebase "C:\Program Files\mdv\EVE API\Test.dll" Microsoft(R) .NET Framework Assembly Registration Utility 2.0.50727.3053 Copyright (C) Microsoft Corporation 1998-2004. All rights reserved. 型は正常に登録されました。 -------------------------- しかし、VBAを利用すると依然症状は変わらず、 「Activexコンポーネントはオブジェクトを作成できません」のエラーメッセージが表示されます。 アセンブリ著名のつけ方に問題があるかもしれませんので、引き続き調査いたします。

その他の回答 (1)

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.1

ちょっと最近プログラミングから離れているのでうろ覚えですが、.コード アクセス セキュリティが邪魔してませんか。 ,NETを配布するときにはそちらの設定を含めないと駄目だったようなj気がします。 やり方は忘れたのそれで調べてみてください。

kooosuke8086
質問者

お礼

お世話になっております。 edp3142様に紹介いただいた、regasm.exe と、 IDii24様に紹介いただいたアセンブリ著名で DLLを利用することができました。

kooosuke8086
質問者

補足

アドバイスありがとうございます。調査してみます。 結果はまたあらためてご報告いたします。 その際、また疑問点がありましたらアドバイスよろしくお願いします。

関連するQ&A

  • VB2010で作成したdllからtlbが作れない

    VB.NETで作成したDLLをExcelのVBAから呼び出すということをやっています。 VB2007のときはよかったのですが、VB2010にしてからうまくいかなくなりました。 具体的には、コンパイルしてClassLibrary1.dllファイルを作成してから C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe ClassLibrary1.dll /tlb:ClassLibrary1.tlb /codebase を実行すると、 ClassLibrary1.dllは有効な.NETアセンブリではないため、読み込めませんでした。 となります。 ClassLibrary1の「アセンブリをCOM参照可能にする」にはチェックを入れています。 おわかりの方がいらっしゃいましたら、どうぞよろしくお願いいたします。

  • C#でのDLL

    OS  :WindowsXP Pro SP1 開発環境:VisualStudio .NET 2003 開発言語:C# 開発形態:Windowsアプリケーション 開発初心者です。よろしくお願い致します。 テキストファイルを読み込んで、その中にある文字列を3つほど返却値として返すDLLを作成したいと思っています。 新規にクラスライブラリのテンプレートでプロジェクトを作成し、プロジェクトメニューからコンポーネントの追加をしました。 質問事項 1.まず、DLLを作成する手順として、上記の方法でよろしいのでしょうか? 2.ファイルからテキストを取得するところまではできるのですが、それを返却値として、呼び出し元の別プロジェクトへは、どうすればよいのでしょうか? どなたか、ご教授お願い致します。

  • 作成したDLLをATL_COM_APPWIZARDで利用する方法について

    VC6++のWin32 Dynamic Link LibraryでDLLを作成しました。 DLLはできたのですが、これを利用する方法がわかりません。 ATL COM AppWizardで作成するアプリからDLLのクラスを使いたいのですが、どのようにすれば使えるのでしょうか? 最初のDLL側は class Test{ Test(){ ShowMessageBox(NULL, "最初のDLL", "呼ばれました", MB_OK); } }; というクラスです。 ATL COM Appwizardでは、 どのように記述すれば、DLLのクラスを利用することができるのでしょうか?

  • C#で作成したDLLをDelphiで呼ぶ方法

    プログラミング初心者です。 以下の内容について、どなたか教えてください。 Visual studio 2010(C#のフォームアプリケーション)とCOM(ActiveX Tool bar)で作成されたフォームをDelphiで呼び出すことは可能でしょうか。 上記の内容を試験的に作成し(Visual studio 2010C#のフォームにCOMから参照したToolbarを貼り付けた物)、プロジェクトの出力方式をクラスライブラリに変更して、DLLの作成までは行えました。しかし、その先のDelphiからの呼び出し方がわかりません。 上記のDLLを用いてDelphiから呼び出す方法をご存知の方がいれば、教えてください。 なお現在の開発環境は以下の通りです。 Visual Studio 2010(C#) Delphi XE2(Trial) ご教授のほど、よろしくお願い致します。

  • VBA,ASPなどから呼び出せるDLLの作成

    DLLを作成したいです。 開発環境 OS:WindowsXP HOME SP2 IDE:Visual C++ 2005 作成したいのはBASP21 DLL(http://www.hi-ho.ne.jp/babaq/basp21.html)のようなVBA、VBScriptから呼び出せるDLLです。 以下のように作成しました。 1 新規プロジェクト>ATLプロジェクト(プロジェクト名:dlltest)   (ダイナミックリンクライブラリ・非属性、デフォルト) 2 プロジェクト>クラスの追加>ATLシンプルオブジェクト(クラス名:cl1、オプションはデフォルト) 3 作成されたインターフェースIcl1を右クリックしてメソッドを追加   メソッド名:mtest1 質問したいのはこのメソッドで値を呼び出し側に返す方法です。 COMの仕様で返り値はHRESULTと聞きました。 LONG型の引数を受け取って2倍した値を返すメソッドみたいな簡単な サンプルの記述方法を教えてください。お願いします。

  • C#で作成したDLLをExcelに内蔵してVBAで実行する方法

    Excel VBAで開発しているのですが制約が多く限界を感じています。C#でDLLを作成してExcelVBAから呼ぶことはできると思いますが、DLLを外付けにするのではなく内蔵することは可能ですか? Excel 2003 .Net Framework 3.5

  • C++で作成したDLLにVBAから配列渡し

    VC++初心者です。よろしくお願いします。 VC++2008ExpressでWindowsアプリケーションのDLLを作成してみました。 Excel2007VBAにて、そのDLLを呼び出して関数を使用したいのですが VBAの配列を参照渡しで渡すと、配列のデータをうまく渡せません。 コードは以下の通りです。 配列ではないデータはうまくいきますが。。。 配列の場合はもっと他に必要なことがあるのでしょうか? よろしくお願いします。 //VC++ DLLコード #include <windows.h> int APIENTRY Add(int[] a) {    return a[0] + a[1] ; } '''VBAのコード Private Declare Function Add Lib "TEST_DLL.dll" (ByRef a() As Integer) As Integer Dim a(1) As Integer Sub test() a(0) = 1 a(1) = 2 MsgBox (Add(a)) End Sub メッセージボックスには3が表示されるはずですが 変な数字に化けてしまいます。 どなたか、ご存知の方、よろしくお願いします。

  • VB6でバイナリ互換でDLL作成するには?

    VB6.0にてActiveX DLLで開発をしたいのですが、 プロジェクトのプロパティ.コンポーネントにてバイナリ互換を選択すると バージョン互換コンポーネントを設定できません。というエラーメッセージが出て、 DLLを作成できません。 プロジェクトはフォーム1画面、標準モジュール複数、クラスモジュールで構成されています。 DLL作成手順のアドバイスをお願いします。 もう1点、 ある程度、開発できたら単体テストを行います。 その際は現場で用意されているテスト起動画面を使用するように言われたのですが、 この方法だと自分の担当画面に修正を加えるたびに下記1~3の作業を行う 必要があると思うのですが、もっとスマートな方法はないのでしょうか? 1.修正したプロジェクトを保存してdllを作成する。 2.作成したdllを所定の場所(現場で指示された場所)に格納 3.テスト起動画面からそのdllを指定して単体テスト

  • VBで作成したdllをAccessで使用

    こんにちは。教えてください。 開発環境はXP/Access VBA(97 SP-1)です。 パスワード暗号化用のFunctionを作ったのですが、 このままではモジュールを開き、ソースを読まれたら 暗号化ロジックが判明してしまいます。 そこで、このFunctionをdll化してしまいたいと思うのですが、 dllをVBで作成する場合、VBのバージョンに制限は あるのでしょうか? Accessのバージョンが古いため、少し心配です。 VBは最新バージョンでも問題ないですかね? 宜しくお願いします。

  • VBAで呼び出したVBのDLLのデバッグ方法

    VB2010で、COM相互運用機能を使って作成したDLLを VBAから呼び出すことはできるのですが この状態でこのDLLをデバッグすることはできないでしょうか。 本来ならば、DLLをデバッグするテストプログラムを VB2010のVB.NETのWindowsフォームアプリケーションか ConsoleApplication1で作成して、 同じソリューションの中に DLLとテストプログラムのプロジェクトを配置して 参照の追加でDLLを参照設定して 両者をデバッグをすると思われますが、 テストプログラムを作るのがかなり大変なのと、 今回作成したDLLは、元々はVBAの中のひとつのプロシージャ―で、 事情があって、このプロシージャ―だけをVBのDLLにしたものです。 このプロシージャ―は元々はVBAの中で正しく動作していたものです。 VBに書き直した時に何らかの不具合が起きていると思われます。 テストプログラムを作らずに、既存のVBAから呼び出して、 DLLの部分の動作だけを(できればVB2010で)デバッグできないでしょうか。 よろしくお願いします。 (WindowsXP SP3 , Excel2003のVBA , Visual Studio 2010)