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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBA-DLLの引数受け渡しについて
C言語・C++・C#
-
C#で作成したDLLをExcelに内蔵してVBAで実行する方法
Microsoft ASP
-
DLLをREGSVR32しないで利用する方法について。
Visual Basic(VBA)
-
-
4
VB6からVB.NET作成DLL呼び出し時のエラー
Visual Basic(VBA)
-
5
IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
HTMLソースが表示のページのも...
-
プログラミングについて プログ...
-
AIのプログラムについて教えて...
-
プログラミングの進学について
-
python エラー
-
Google ColaboでGUI作成
-
プログラミングを学ぼうと思い...
-
ネットワークフォルダの中身を...
-
AIの登場でプログラマーたちが...
-
このURLで広告を出しているのは...
-
pythonでAmazonのほしいものリ...
-
以下の技能を無料で受講できる...
-
PythonのTkinter詳しい方へ。画...
-
Web初心者です。 簡易的なWebペ...
-
httpリクエストの送り元の特定
-
pythonにてseleniumを使うも、...
-
プログラマーに向いている人の...
-
ホログラムを作ってくれる会社...
-
近年誕生したプログラミング言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
linux上でgetchを使いたい
-
VBScrptについて
-
エクセルVBAでのネットワークプ...
-
VB .NETで作成したソフトが、他...
-
JavaScriptでキオスクモードを...
-
[C#]リモートアクセスのProcess...
-
親スレッドが子スレッドを監視...
-
【PHP】UUID・UDIDによる端末判...
-
閲覧したスクロール位置に戻る...
-
携帯サイトの背景画像設定と、...
-
エラー'429'ACtiveXコンポーネ...
-
docomoのスマホ データ検索ソ...
-
携帯の端末IDなどの保存方法
-
会員制動画配信サイトを作りた...
-
「Androidアプリ開発」JSPやサ...
-
iHTMLとCHTMLの違いを教えてく...
-
Android「adb shell」パスを知...
-
FindFirstFileのファイル属性の...
-
C#で作成したDLLをExcelVBAで利...
-
収集した緯度、経度の平均値の...
おすすめ情報