2つの問題:
1)基本的な.NETアセンブリはILMergedアセンブリに含まれていません
.NET 3.5 / VisualStudio2008から.NET4/ Visual Studio 2010にアップグレードした後、ビルド後のILMergeの使用に問題があります。ターゲットフレームワークが「.NETFramework4」に設定されているプロジェクトがいくつかあるソリューションがあります。 。次のILMergeコマンドを使用して、個々のプロジェクトDLLを単一のDLLにマージします。
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
.NET 4フレームワークディレクトリの場所の指定を省略した場合、ILMergeから「未解決のアセンブリ参照は許可されていません:システム」エラーが発生します。MSTestディレクトリの場所の指定を省略した場合、「未解決のアセンブリ参照は許可されていません:Microsoft.VisualStudio.QualityTools.UnitTestFramework」エラーが発生します。
上記のILMergeコマンドは機能し、DLLを生成します。ただし、別の.NET 4 C#プロジェクトでそのDLLを参照し、その中でコードを使用しようとすると、次の警告が表示されます。
プライマリ参照「MyILMergedDLL」は、バージョンよりも高いバージョン「4.0.65535.65535」を持つ.NET Frameworkアセンブリ「mscorlib、Version = 4.0、Culture = neutral、PublicKeyToken = b77a5c561934e089」に間接的に依存しているため、解決できませんでした。現在のターゲットフレームワークの「4.0.0.0」。
その後、フラグを削除して/targetplatform:v4
MyILMergedDLL.dllを使用しようとすると、次のエラーが発生します。
タイプ'System.Xml.Serialization.IXmlSerializable'は、参照されていないアセンブリで定義されています。アセンブリ'System.Xml、Version = 4.0.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089'への参照を追加する必要があります。
私はそれをしなければならないようには思えません。MyILMergedDLL.dll APIを使用する人は誰でも、参照するライブラリへの参照を追加する必要はありません。どうすればこれを回避できますか?
2)マージされたアセンブリを使用する場合にのみTypeLoadException
編集:これを超えて、MyILMergedDLL.dllを使用するコンシューマープロジェクトにへの参照を追加した場合でも、System.Xml
MyILMergedDLL.dllのコードを使用すると、次の例外が発生します。
System.TypeLoadException:アセンブリ'MyILMergedDLL、Version = 1.0.1.1、Culture = neutral、PublicKeyToken=...'からタイプ'System.Func`2'を読み込めませんでした。
これは私の消費者プロジェクトのコードです。を引き起こした行TypeLoadException
は2番目のものです:
var keys = new[] {"a", "b", "c"};
var row = new Row(keys);
Row
をスローする特定のコンストラクターTypeLoadException
は、のパブリッククラスで定義されておりMyILMergedDLL
、個々のプロジェクトDLLを参照するときにこのコンストラクターを使用すると、正常に機能します。例外が発生するのは、ILマージされたDLLを参照するときにこのコンストラクターを使用する場合のみです。何が起こっているのかわかりません。
そのコンストラクターは次のとおりです。
public Row(IEnumerable<string> keys) : base(keys) { }
そしてbase
それが参照しているはこのコードを持っています:
foreach (string key in keys.Where(
key => !string.IsNullOrEmpty(key)
))
{
_dic.Add(key, string.Empty);
}