
C#で作成したDLLをExcelのVBAで利用し、
そのExcelのブックファイルを多人数に配布しようとしています。
開発端末では動作を確認できたのですが、
その他の端末で試してみてもエラーメッセージが表示され動作しません。
下記など、似たような質問がすでにありますが、
解決方法が不明でしたので質問させていただきました。
http://oshiete.goo.ne.jp/qa/2408504.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以外に同梱が必要なコンポーネントやインストール時に必要な設定などないでしょうか?
また、お気づきの点がありましたら合わせてご指摘いただければ幸いです。
No.2ベストアンサー
- 回答日時:
.NET で作成した COM 対応コンポーネントのレジストリ登録には regasm.exe を利用してください。
regasm.exe /codebase XXX.DLL
です。
この回答への補足
アドバイスありがとうございます。
試験環境で紹介いただたコマンドを実行したところ、下記のようなエラーが表示されました。
--------------------------
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コンポーネントはオブジェクトを作成できません」のエラーメッセージが表示されます。
アセンブリ著名のつけ方に問題があるかもしれませんので、引き続き調査いたします。
お世話になっております。
edp3142様に紹介いただいた、regasm.exe と、
IDii24様に紹介いただいたアセンブリ著名で
DLLを利用することができました。
前回補足との違いはExcelブックファイルを作り直したことです。
よって今後の課題は下記となりますが、本件とは趣旨が異なると思いますので、
疑問点が出た際に改めて質問させていただきます。
1) DLLの利用に regasm.exe が必要なため、インストーラーなどにその仕組みを入れる必要がある。
2) regasm.exe の実行にはAdmin権限が必要なため、利用者にその旨を促す。
3) DLLのバージョンが替わると、これまで利用していたブックファイルが利用できない可能性がある。
4) アンインストールの際に regasm.exe で登録した内容をクリーニングする必要がある。
ありがとうございました。
No.1
- 回答日時:
ちょっと最近プログラミングから離れているのでうろ覚えですが、.コード アクセス セキュリティが邪魔してませんか。
,NETを配布するときにはそちらの設定を含めないと駄目だったようなj気がします。
やり方は忘れたのそれで調べてみてください。
この回答への補足
アドバイスありがとうございます。調査してみます。
結果はまたあらためてご報告いたします。
その際、また疑問点がありましたらアドバイスよろしくお願いします。
お世話になっております。
edp3142様に紹介いただいた、regasm.exe と、
IDii24様に紹介いただいたアセンブリ著名で
DLLを利用することができました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- その他(スマホアプリ・スマホゲーム) アプリをスマホにダウンロード、インストールする方法 3 2022/08/13 11:26
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数学、プログラミング、物理、...
-
vba クリップボードクリアにつ...
-
パイソンのソースコードをChatG...
-
OS入ってる機器のソフト・アプ...
-
pip --versionがエラーになる
-
pythonの実行に関する質問
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
Python... 環境設定 初心者です...
-
VBAでパワーシェルを実行したい...
-
画像生成AIのプロンプトの作り...
-
Gitについて質問。 クローンし...
-
HTMLソースが表示のページのも...
-
Rでのデータフレーム作成について
-
ネットワークフォルダの中身を...
-
AIの登場でプログラマーたちが...
-
初心者powershellのPS1ファイル...
-
Google ColaboでGUI作成
-
REGZAに接続できない(パソコン)
-
MOVEコマンドでサブフォルダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
linux上でgetchを使いたい
-
エクセルVBAでのネットワークプ...
-
[C#]リモートアクセスのProcess...
-
VBScrptについて
-
JavaScriptでキオスクモードを...
-
携帯サイトの.htaccessによるア...
-
VB .NETで作成したソフトが、他...
-
android開発初心者です。 2つの...
-
C#で作成したDLLをExcelVBAで利...
-
C++で引数の型の構造体をif文で...
-
docomoメール内でURLリンク
-
"\\"(円マーク)が入ってしまい...
-
デバイス別に振り分けるJavaScr...
-
MACアドレスについて
-
エラー'429'ACtiveXコンポーネ...
-
【PHP】UUID・UDIDによる端末判...
-
収集した緯度、経度の平均値の...
-
Android「adb shell」パスを知...
-
FindFirstFileのファイル属性の...
-
レスポンシブWebとjQuery Mobile
おすすめ情報