質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3207閲覧

ILMergeは、作成されたサブフォルダ内のDLLも統合できますか?

RyukeO

総合スコア17

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2020/04/20 03:52

お世話になります。

勉強も兼ねてトライしているのですが、ILMergeを使用すると.exeにDLLファイルを埋め込めるとのことで
挑戦しています。

現在作成したソフトはSystem.Data.SQLiteを組み込んでいるので、ビルドすると、

ソフト.exe
System.Data.SQLite.dll
x64\SQLite.Interop.dll
x86\SQLite.Interop.dll

というファイル配置とファイル数が最低必要でした。
これからどんどん機能をつかしていこうとするときっとDLLがたくさんになって.exeファイルが埋もれてしまうのを防ぎたいのでILMergeを使用してみたいと思いました。
(app.configを編集して任意のフォルダにまとめる方法はやったことがあるのでできるのですがILMergeも使えるようになりたいので質問させていただきます)

上記の構造ですと

ILMerge /out:ソフト_Merge.exe ソフト.exe System.Data.SQLite.dll

は、エラーなく起動しましたが、x64とx86フォルダ内の各SQLite.Interop.dllは統合できていませんので

ILMerge /out:ソフト_Merge.exe ソフト.exe System.Data.SQLite.dll SQLite.Interop.dll ILMerge /out:ソフト_Merge.exe ソフト.exe System.Data.SQLite.dll x64\SQLite.Interop.dll x86\SQLite.Interop.dll ILMerge /wildcards /out:ソフト_Merge.exe ソフト.exe *.dll x64*.dll x86*.dll

とかいろいろ試してもエラーが出てしまいます。

ちなみにx64とx86フォルダとその中のファイルは勝手に作られてしまうもので、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答として成立しているか怪しいですが....参考文献を見たほうが確実です。

概略

次の理由によりILMerge等は失敗する(できない)認識です。

  • ネイティブライブラリは統合できません(要出典)
  • x86またはx64、AnyCPUを限定する必要あり
  • 仮に統合してもDLL内部でLoadLibraryしているので動作できない認識

詳細

SQLiteはx64内またはx86フォルダ内のDLLを呼び出し元でDLLをフォルダパスを指定してロードしている(3246行目付近)ため、組み込むのは難しい認識です。
また、当該DLLはネイティブコードであるため、予期せぬことが起きる可能性が高いです(記憶ではネイティブコードは統合できなかったはず)。

回避案

どうしても統合したい場合はピュアなライブラリ(NSQLiteなど)を採用されるか一本化の方法は違うやり方を検討してください。

ファイルが埋もれることを避けたい場合は、ラッパープログラムや手軽にbatファイル・ショートカット等を検討するのも良いかと存じます。

  • ホストプログラム→ワーキングディレクトリを指定してexeを起動して終了
  • batファイルでサブディレクトリのexeをキック

ソフトウェアの配布を気にされている場合は、InnoSetup等を使用して1つにまとめてインストールする等が良いかと存じます。

インストールなしで、かつ、単一ファイルをご希望される場合はホストプログラムを一時フォルダに展開して、実行し、終了したら後始末する等の方法をとることが可能かと存じます。

参考文献

上記回答より詳しいので、????を参照すること

できない→ワークアラウンドあるよ(備考:Staticメソッドのロードで行っているが、クラスの参照順序によっては展開が間に合わない可能性がある)

投稿2020/04/21 16:38

編集2020/04/21 16:48
testset

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RyukeO

2020/04/22 05:02

なるほど、できないのですね。 何でもかんでも1つにまとめることができるものだと思いこんでいましたので、素人考えの質問をしてしまいました^^; 回答いただきどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問