C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ビルド時にdllを静的に取り込む設定について


(過去ログ 106 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■63311 / inTopicNo.1)  ビルド時にdllを静的に取り込む設定について
  
□投稿者/ VB.NETビギナー (1回)-(2012/08/13(Mon) 11:15:37)

分類:[VB.NET/VB2005 以降] 

こんにちは。

VB.NET2010で開発をし始めたばかりの初心者です。

現在、VB.NETで作成したexeを起動すると
「アプリケーションのコンポーネントで、ハンドルされていない例外
が発生しました。。。」
「ファイルまたはアセンブリ’’、またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。」
というエラーが出て、正常に起動できません。

これを正常に起動しようとすると、エラーで表示されているファイルをexeと同様のパスに置いてやるひつようがあります。
これを何とかexeのみで正常起動できるようにできないものでしょうか。。。


具体的には、フォーム起動時に、予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、私が作成したexe単独で起動できないのです。exe起動時は必ずそのdllを読みに行くようです。

これを何とかexe単独で起動できるようにしたいのです。
もしかして、ビルド時にそのdllの内容をexeに含ませ、exe単独で起動できるような設定方法でもあるのでしょうか。

なんとなく単純なもののような気もするのですが、ネット上で解決方法を探しても見当たりません。

もしご存知の方がいれば、アドバイスをよろしくお願いいたします。

引用返信 編集キー/
■63312 / inTopicNo.2)  Re[1]: ビルド時にdllを静的に取り込む設定について
□投稿者/ 渋木宏明 (10回)-(2012/08/13(Mon) 11:56:53)
渋木宏明 さんの Web サイト
2012/08/13(Mon) 11:58:00 編集(投稿者)

> 具体的には、フォーム起動時に、予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、私が作成したexe単独で起動できないのです。exe起動時は必ずそのdllを読みに行くようです。
>
> これを何とかexe単独で起動できるようにしたいのです。

できないです。

すべてマネージなアセンブリなら ilmarge などのツールで1つのアセンブリに統合することも可能ですが、ActiveX EXE をクライアントと統合する方法はありません。

この手の問題は、インストーラを作成して解決するのがよくあるパターンです。
引用返信 編集キー/
■63313 / inTopicNo.3)  Re[2]: ビルド時にdllを静的に取り込む設定について
□投稿者/ VB.NETビギナー (2回)-(2012/08/13(Mon) 12:59:29)
No63312 (渋木宏明 さん) に返信
> 2012/08/13(Mon) 11:58:00 編集(投稿者)
>
>>具体的には、フォーム起動時に、予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、私が作成したexe単独で起動できないのです。exe起動時は必ずそのdllを読みに行くようです。
>>
>>これを何とかexe単独で起動できるようにしたいのです。
>
> できないです。
>
> すべてマネージなアセンブリなら ilmarge などのツールで1つのアセンブリに統合することも可能ですが、ActiveX EXE をクライアントと統合する方法はありません。
>
> この手の問題は、インストーラを作成して解決するのがよくあるパターンです。
なるほど。やはりできませんか。
別の方法を模索してみます。
ご回答ありがとうございました。
解決済み
引用返信 編集キー/
■63314 / inTopicNo.4)  Re[1]: ビルド時にdllを静的に取り込む設定について
□投稿者/ Azulean (14回)-(2012/08/13(Mon) 13:34:14)
重要ではなさそうな部分は割愛します。

No63311 (VB.NETビギナー さん) に返信
> 予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、<略>
> これを何とかexe単独で起動できるようにしたいのです。
> もしかして、ビルド時にそのdllの内容をexeに含ませ、exe単独で起動できるような設定方法でもあるのでしょうか。

省きたいのは、「Interop.*.dll」であって、「exeファイル(COM)」ではないですよね?

たとえ「Interop.*.dll」を省けたとしても、「exeファイル(COM)」が必要なのは渋木さんが書かれているとおりです。それでも、その DLL を省きたいのでしょうか?


// Interop.*.dll であれば、その参照設定のプロパティで「型の埋め込み」でなんとかなったような?
// 試していないので自信なし。(VS2010 以上のみ)
引用返信 編集キー/
■63315 / inTopicNo.5)  Re[2]: ビルド時にdllを静的に取り込む設定について
□投稿者/ VB.NETビギナー (3回)-(2012/08/13(Mon) 14:12:14)
No63314 (Azulean さん) に返信
> 重要ではなさそうな部分は割愛します。
>
> ■No63311 (VB.NETビギナー さん) に返信
>>予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、<略>
>>これを何とかexe単独で起動できるようにしたいのです。
>>もしかして、ビルド時にそのdllの内容をexeに含ませ、exe単独で起動できるような設定方法でもあるのでしょうか。
>
> 省きたいのは、「Interop.*.dll」であって、「exeファイル(COM)」ではないですよね?
>
> たとえ「Interop.*.dll」を省けたとしても、「exeファイル(COM)」が必要なのは渋木さんが書かれているとおりです。それでも、その DLL を省きたいのでしょうか?
>
実は、その通りです。「exeファイル(COM)」は固定です。
不要なのはそれをアクセスする
「Interop.*.dll」
です。
挙動を見ていると、どうも私が作成したexeファイルはこのdllを介して、「exeファイル(COM)」をアクセスしているようなのです。
したがって、この「Interop.*.dll」を介さずに、例えば作成したexeに埋め込んでしまい、exeだけで起動できるようにしたいのです。
そんなことが可能なのでしょうか?


>
> // Interop.*.dll であれば、その参照設定のプロパティで「型の埋め込み」でなんとかなったような?
> // 試していないので自信なし。(VS2010 以上のみ)
ネットで調べると、どうも「相互運用機能型の埋め込み」というのが、プロパティにあるようですが、ちょっとそのプロパティが見当たりません。
調べてみます。
ありがとうございます。
引用返信 編集キー/
■63317 / inTopicNo.6)  Re[3]: ビルド時にdllを静的に取り込む設定について
□投稿者/ VB.NETビギナー (4回)-(2012/08/13(Mon) 15:08:53)
No63315 (VB.NETビギナー さん) に返信
> ■No63314 (Azulean さん) に返信
>>重要ではなさそうな部分は割愛します。
>>
>>■No63311 (VB.NETビギナー さん) に返信
> >>予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、<略>
> >>これを何とかexe単独で起動できるようにしたいのです。
> >>もしかして、ビルド時にそのdllの内容をexeに含ませ、exe単独で起動できるような設定方法でもあるのでしょうか。
>>
>>省きたいのは、「Interop.*.dll」であって、「exeファイル(COM)」ではないですよね?
>>
>>たとえ「Interop.*.dll」を省けたとしても、「exeファイル(COM)」が必要なのは渋木さんが書かれているとおりです。それでも、その DLL を省きたいのでしょうか?
>>
> 実は、その通りです。「exeファイル(COM)」は固定です。
> 不要なのはそれをアクセスする
> 「Interop.*.dll」
> です。
> 挙動を見ていると、どうも私が作成したexeファイルはこのdllを介して、「exeファイル(COM)」をアクセスしているようなのです。
> したがって、この「Interop.*.dll」を介さずに、例えば作成したexeに埋め込んでしまい、exeだけで起動できるようにしたいのです。
> そんなことが可能なのでしょうか?
>
>
>>
>>// Interop.*.dll であれば、その参照設定のプロパティで「型の埋め込み」でなんとかなったような?
>>// 試していないので自信なし。(VS2010 以上のみ)
> ネットで調べると、どうも「相互運用機能型の埋め込み」というのが、プロパティにあるようですが、ちょっとそのプロパティが見当たりません。
> 調べてみます。
> ありがとうございます。
私のところでは、上記のようなdllのプロパティには「相互運用機能型の埋め込み」という項目がありません。
これって、COMが提供するものなのでしょうか?だとすると、参照する側としては、どうすることもできないということですかねえ。。。


引用返信 編集キー/
■63318 / inTopicNo.7)  Re[4]: ビルド時にdllを静的に取り込む設定について
□投稿者/ VB.NETビギナー (6回)-(2012/08/13(Mon) 16:30:58)
No63317 (VB.NETビギナー さん) に返信
> ■No63315 (VB.NETビギナー さん) に返信
>>■No63314 (Azulean さん) に返信
> >>重要ではなさそうな部分は割愛します。
> >>
> >>■No63311 (VB.NETビギナー さん) に返信
>>>>予め参照設定しあるexeファイル(COM)のオブジェクトを生成しているのですが、これだと、コンパイラがビルド時に参照先のexe(COM)に関連するdllを自動的にローカル(exeと同様のパス)に生成し、<略>
>>>>これを何とかexe単独で起動できるようにしたいのです。
>>>>もしかして、ビルド時にそのdllの内容をexeに含ませ、exe単独で起動できるような設定方法でもあるのでしょうか。
> >>
> >>省きたいのは、「Interop.*.dll」であって、「exeファイル(COM)」ではないですよね?
> >>
> >>たとえ「Interop.*.dll」を省けたとしても、「exeファイル(COM)」が必要なのは渋木さんが書かれているとおりです。それでも、その DLL を省きたいのでしょうか?
> >>
>>実は、その通りです。「exeファイル(COM)」は固定です。
>>不要なのはそれをアクセスする
>>「Interop.*.dll」
>>です。
>>挙動を見ていると、どうも私が作成したexeファイルはこのdllを介して、「exeファイル(COM)」をアクセスしているようなのです。
>>したがって、この「Interop.*.dll」を介さずに、例えば作成したexeに埋め込んでしまい、exeだけで起動できるようにしたいのです。
>>そんなことが可能なのでしょうか?
>>
>>
> >>
> >>// Interop.*.dll であれば、その参照設定のプロパティで「型の埋め込み」でなんとかなったような?
> >>// 試していないので自信なし。(VS2010 以上のみ)
>>ネットで調べると、どうも「相互運用機能型の埋め込み」というのが、プロパティにあるようですが、ちょっとそのプロパティが見当たりません。
>>調べてみます。
>>ありがとうございます。
> 私のところでは、上記のようなdllのプロパティには「相互運用機能型の埋め込み」という項目がありません。
> これって、COMが提供するものなのでしょうか?だとすると、参照する側としては、どうすることもできないということですかねえ。。。
>
なぜか、CreateObjectを使うと、Interop.*.dll が作られず、作成したexe単独で起動できるようになりました。
そういうものなのでしょうか。
いずれにせよ、解決できました。
色々アドバイス頂き、ありがとうございました。
解決済み
引用返信 編集キー/
■63321 / inTopicNo.8)  Re[5]: ビルド時にdllを静的に取り込む設定について
□投稿者/ Azulean (15回)-(2012/08/13(Mon) 21:53:26)
No63317 (VB.NETビギナー さん) に返信
> 私のところでは、上記のようなdllのプロパティには「相互運用機能型の埋め込み」という項目がありません。
> これって、COMが提供するものなのでしょうか?だとすると、参照する側としては、どうすることもできないということですかねえ。。。

対象のフレームワークが .NET Framework 4 になっていることが条件です。
VB2010 を使っていても、.NET Framework 2.0 〜 3.5 が対象となるようにプロジェクトのプロパティで設定されているようなら、見つからないかと思われます。


No63318 (VB.NETビギナー さん) に返信
> なぜか、CreateObjectを使うと、Interop.*.dll が作られず、作成したexe単独で起動できるようになりました。
> そういうものなのでしょうか。

Interop.*.dll は COM で公開されているクラスを .NET のクラスとして扱えるようにするための定義を集めたものとお考えください。
そういった型を使わない、CreateObject などの手法であれば Interop.*.dll は不要です。

ただし、型が宣言されていないのでコンパイル時にメソッドやプロパティのスペルミス、引数の過不足があってもエラーになりません。実行時に例外として初めてエラーになります。
実行するまで正しいかわからないので、コードの安全性としては悪くなりますが、Interop.*.dll に依存しなくはなります。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -