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以外に同梱が必要なコンポーネントやインストール時に必要な設定などないでしょうか?
また、お気づきの点がありましたら合わせてご指摘いただければ幸いです。
お礼
お世話になっております。 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コンポーネントはオブジェクトを作成できません」のエラーメッセージが表示されます。 アセンブリ著名のつけ方に問題があるかもしれませんので、引き続き調査いたします。