• ベストアンサー
  • 困ってます

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以外に同梱が必要なコンポーネントやインストール時に必要な設定などないでしょうか? また、お気づきの点がありましたら合わせてご指摘いただければ幸いです。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数9103
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.2
  • edp3142
  • ベストアンサー率60% (226/373)

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

アドバイスありがとうございます。 試験環境で紹介いただたコマンドを実行したところ、下記のようなエラーが表示されました。 -------------------------- 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コンポーネントはオブジェクトを作成できません」のエラーメッセージが表示されます。 アセンブリ著名のつけ方に問題があるかもしれませんので、引き続き調査いたします。

関連するQ&A

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

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

  • 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++/CLIとC#の連携について

    いつも拝見させていただいております。 現在、C++/CLIとC#にて連携を行っているのですが、C++/CLIで作成したクラス配列 がC#側でどのようにすれば受け取れるのか方法がわかりません。 C++/CLIで作成しているクラス配列はSystem::Collections::Generic::Listを使用 して配列化しています。 下記がC++/CLIのソースになります。 List<testClass>^% testClass::GetList() { List<testClass>^ lpTestClassList = gcnew List<testClass>(); testClass^ lpTestClass; lpTestClass = gcnew testClass(); lpTestClassList->Add(lpWatchServiceMasterInfoWrapper); return lpTestClassList; } これをC#側で使用しようとすると下記エラーが発生します。  「この言語によってサポートされていません」 C++/CLI⇒C#間の連携ではListクラスを使用することは不可能なのでしょうか? クラスを配列にして引き渡したいだけなので、他の方法等含めて何か参考になることがありましたら ご教授ください。 よろしくお願い致します。 開発環境  C++/CLI ⇒ DLL(ネイティブなコードを参照するためのラッパー用DLL)  C# ⇒ アプリケーション

その他の回答 (1)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

質問者からの補足

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

関連するQ&A

  • C#でのDLL

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

  • C#で使えるオブジェクトを作成するには

    VisualC++のMFCを利用して、C#でも簡単に使えるオブジェクトを作成したいです。 MFCのオートメーションをサポートするDLLを作成しまして、 メソッドは echo とします。 VBSでは、 dim obj set obj = CreateObject("mytest.test") MsgBox obj.echo("hello") で簡単にオブジェクトを利用することができますが、 WEBで探したら、C#は結構面倒です。 MFCでどうやってオブジェクトを作ったら、 C#でもVBSのように簡単に使えるでしょうか。 ひとつ案として、ActiveXコントローラーを作ったら、 C#のフォームに貼り付けて、それならば、簡単にメソッドを呼び出すことができます。でも、GUIが必要になっちゃいます。 できればC#でこんな風に、  Mytest.test obj = new Mytest.testClass(); MessageBox.Show(obj.echo("hello")); 見たいなことをしたいです。 MFCでどうやってこのような Mytest.test を作れるでしょうか。 よろしくお願いします。

  • C#でdllを動的に使用

    下記のソースコードでPluginのTestClassがstaticクラスの場合動かないのですが、 staticクラスのstaticメンバー(いわゆるただの関数)を呼び出す方法を教えてください。 お願いします。 Assembly assem = Assembly.LoadFrom("Plugin.dll"); Type AssType = assem.GetType("Plugin.TestClass"); dynamic obj = Activator.CreateInstance(AssType); label1.Text = obj.GetMessage();

  • 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) ご教授のほど、よろしくお願い致します。

  • 作成した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をVBScriptで使うときのマーシャリングの問題

    お世話になります。 現在ClassicASPでWebアプリケーションを開発しているのですが、 その時にC#で作成したdllを使用したいと思い、 COM登録をしてASP側ではServer.CreateObjectで使用しようとしています。 しかし、データの受け渡し部分でずっとつまづいています。 やりたいことは、C#側の関数の戻り値で独自のクラス(構造体)の配列を戻したいのです。 以下サンプルコードです。 ASP側 <%@ Language=VBScript%> <% Response.ContentType = "text/html" Dim testObject set testObject = Server.CreateObject("TestObject") list = testObject.getList() Response.Write(TypeName(list)) ' ここで、[VBScript でサポートされていないオートメーションが変数で使用されています]エラー %> C#側 [StructLayout(LayoutKind.Sequential)] public struct TestData { [MarshalAs(UnmanagedType.BStr, SizeConst = 1024)] public String title; } public interface ITestObject { TestData[] getList(); } public class TestObject : ITestObject { public TestData[] getList() { TestData[2] result; result[0].title = "1"; result[1].title = "2"; return result; } } あとどういった処理が足りないのでしょうか? やりたいことは、構造体配列をASP側に渡したいだけです。 本当に困っています、なにとぞ宜しくお願い致します。

  • C++で作ったDLLをC#で使うには?

    C#でC++で書いたDLLを使いたいと思っていますが、可能でしょうか? 本で調べてみると出来ると思って挑戦しています。 public class Form1 : System.Windows.Forms.Form { [DllImport("test.dll")] public static extern long abc(); ..... と宣言し、使う時には long a = abc(); としています。 しかし、いざデバッグして実行してみると、エントリポイントが見つかりません。と表示されてしまいます。 (そもそもDLLが使えるのならばですが)できればC#でC++のDLLが使いたいため、詳しい方ご教授願います。

  • 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#のビルド方法について質問です。

    IDEをつかわず、コマンドプロンプト上でC#のソースをビルドする時の方法について質問です。 まず以下のようなコードがあるとします。 まずC:\の直下に以下のソースを作成しました。 =================================================== using System; using System.IO; using System.Windows.Forms; namespace Add.TestClass{ public class LibraryClass{ public LibraryClass(){ MessageBox.Show("クラスライブラリコンストラクタの実行"); } } } =================================================== 上記クラスをdllファイルとしてビルドします。 csc /t:library /out:Add.TestClass library.class  と上記のようにビルドしました。するとAdd.TestClass.dllというファイルが確かにできあがりました。 次にこれを実際に実行するためのファイルをつくりました。 それが以下になります。 同じくC:\直下に以下のようなソースを作成します。 =================================================== using System; using System.IO; using System.Windows.Forms; using Add.TestClass; public class MainClass{ public static void Main(String [] args){ LibraryClass obj = new LibraryClass(); } } =================================================== このファイルをビルドします。 csc /r:Add.TestClass.dll main.cs としてビルドし、その後 mainというファイルを実行しました。 するとキチンとMessageBoxで MessageBox.Show("クラスライブラリコンストラクタの実行");が実行されました。 ここまでは問題ないのですが、この場合 main.exeファイルとAdd.TestClass.dllというファイルが 同じ階層に存在するような状態になっているのですが、これを main.exeファイルのある階層にdllというディレクトリを作成し そのdllの中にAdd.TestClass.dllというファイルをおいた階層状況でmain.exeファイルを実行したいのです。 そのためにまず、 csc /r:”C:\dll\Add.TestClass.dll" main.cs 上記のようなビルドオプションでビルドしてみたのですが、ビルドはとおりましたが -------------------------------------------------------------------------------------------------------------------- ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン ブリ 'Add.TestClass, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、ま たはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりませ ん。 場所 MainClass.Main(String[] args) -------------------------------------------------------------------------------------------------------------------- というエラーがでました。 このdllファイルを特定の任意のディレクトリ内において、main.exeを実行してうまく動くようにするためには どのようなビルドオプションをつけたらいいのでしょうか? よろしくご教授お願いいたしま。

  • ExcelVBA ユーザーフォームのコードがない

    いつもお世話になっています。 Excel vbaで質問させてください。 あるExcelブック(test.xlsとします)を開くと、ユーザーフォーム(と思う)が表示されます。 (この時、Excelアプリケーションは「表示」されていてモーダルの状態です) ユーザーフォームで日付を選び、「これでOK」ボタンをクリックすると 新規ブックとして「text_0614.xls」が出来て、これが表示ブックとなります。 (元のtest.xlsは閉じられています) vbaコードの修正がしたくて、VBEから作業しようとしたところ ユーザーフォームモジュールも、標準モジュールも何も見当たりません。 Thisworkbookのイベントも何も書いてありません。 プロジェクトにパスワードがかかっているのかと思いましたが、もしそうだとしても プロジェクトウィンドウに、「フォーム」というフォルダは表示されると思いますし、 また、ダブルクリックしてもパスワードを求められることがありませんので パスワードがかかっているようには見えません。 これはExcelVBAのユーザーフォームじゃないのでしょうか?(VB?) または、もし、この「フォーム」フォルダごと、ユーザーに見せないやり方があるのでしょうか? どなたかご存知の方いらっしゃいましたらご教示ください! WinXP SP3 Excel2003 SP3 使用です。 どうぞよろしくお願いします。