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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2069閲覧

ILMerge.exeで結合したDLLが動作に失敗する

JanTh1989

総合スコア87

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/03/01 05:17

<前提>
ILMerge.exeを使用して、自作ライブラリと参照設定している外部ライブラリの結合を行おうと考えています。
結合対象はいくつかあります。
・log4net.dll
・Newtonsoft.Json.dll
・AML.Engine.dll
・AML.Engine.Services.dll

<問題>
log4net.dll、Newtonsoft.Json.dllについては、結合後の動作確認が取れました。
ただ、AML.Engine系を結合すると、例外が発生するようになりました。
例外はTypeLoadException。
メッセージは
「型 'Aml.Engine.CAEX.InstanceHierarchyType' にあるメソッド 'GetEnumerator' に実装が含まれていません。」
とのことです。
なぜAML.Engine系のみそうなるのかが分かりません。
自作ライブラリや、コマンドなどに問題があるんでしょうか。
ご教授の程、お願いいたします。

<補足>
開発環境:VisualStudio 2015 Professional
.NET:バージョン4.6

ILMerge実行コマンド:
cd "C:"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /internalize /ndebug /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.6" /out:"Marge\自作ライブラリ" 自作ライブラリ log4net.dll Newtonsoft.Json.dll AML.Engine.dll AML.Engine.Services.dll

ILMerge.exe.configの内容:

<?xml version="1.0" encoding="utf-8"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/> </startup> </configuration>

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

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

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

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

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

MMashiro

2019/03/01 06:04 編集

回答した後に気づいたので質問します、エラーが出るタイミングはマージ時でしょうか?マージ後のライブラリ使用時でしょうか?
JanTh1989

2019/03/01 06:46

マージは正常終了し、マージ後のライブラリで例外が発生します。 InstanceHierarchyTypeクラス参照前に別関数でCAEXDocumentクラスを呼びますが例外はなく、InstanceHierarchyTypeクラス参照で発生します。
MMashiro

2019/03/01 06:59

問題の再現ができました、ありがとうございます
JanTh1989

2019/03/01 07:03

とりあえず追加で試してみたものを書いておきます。 ILMerge.exe実行コマンドの「/internalize」を消してみました。 解決しませんでしたが・・・。 IFに対してのメソッド実装不足の認識なので、internalゆえに非実装と同列になる、とかかと思ったんですけどね・・・。
guest

回答1

0

ベストアンサー

こちらの環境では自作exe + log4net + Newton.Json + AMLで問題なくマージできました
自作ライブラリ含め全てのdllのターゲットの.NETバージョンが一致している事を一度確認してみてください。

補足を受けて

軽く調べたところILMergeのバグの可能性が高いです
https://github.com/Microsoft/CodeContracts/issues/53

オープンソース版ILMergeであるILRepackを使用したところ正常なバイナリが吐かれたので
一度こちらを使ってみてはいかがでしょうか
引数は全く変えずにできると思います

https://github.com/gluck/il-repack
(またはDirectLinkから .nupkg -> .zip に変更 http://nuget.org/api/v2/package/ILRepack)

投稿2019/03/01 06:03

編集2019/03/01 07:01
MMashiro

総合スコア2378

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

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

JanTh1989

2019/03/01 07:00 編集

ご回答ありがとうございます。 .NETバージョンについては、結合のベースになる自作ライブラリが4.6で、それへの参照設定となり、packages.configでもtargetFrameworkは4.6になっているようです。
JanTh1989

2019/03/01 07:57

ILRepackを使用してみたところ、正常動作の確認が取れました。 これでどうにかなりそうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問