ローカルマシンで問題なくビルドできるプロジェクトがありますが、TFSでビルドすると、次のエラーが表示されます-
SGEN:不正な形式のアセンブリをロードしようとしました:
このトピックに関する他の多くの投稿を読んだ後、ほとんどの人はビルドタイプをx64ではなくx86またはAny CPUに変更する必要があると言っていますが、無数の組み合わせを試した後、これは解決策ではありませんでした。私のプログラムはWindowsサービスでもあるため、アプリケーションプールを設定して32ビットアプリケーションを許可する(他の人が提案した)ことも解決策ではありません。
私の問題はこのページでようやく解決されました- http://aplocher.wordpress.com/2012/10/12/sgen-an-attempt-was-made-to-load-an-Assembly-with-an -incorrect-format-tfs-2010 /
将来そのページが消える場合に備えて、関連する手順を次に示します-
問題は、64ビットバージョンのsgen.exeを含む最新の Windows SDK をインストールすると消えます。
http://msdn.Microsoft.com/en-us/windows/desktop/bg162891.aspx
時々(それが役に立たない場合)古いバージョンが役立ちます:
http://msdn.Microsoft.com/en-us/windows/desktop/hh852363.aspx
何らかの理由で、64ビットバージョンのsgenは Microsoft Build Tools に含まれていません
リリースでプロジェクト(プラットフォームターゲットがx86に設定されている)をコンパイルしようとすると、同じエラーが発生しました。デバッグで正常にコンパイルされました。リリースでは、シリアル化の生成アセンブリが実行されていることがわかりました。したがって、SGenユーティリティの呼び出し。問題は、MSBuildがx86 EXEに対してSGenのx64バージョンを呼び出し、エラーが発生したことです。 MSBuildが正しいバージョンのSGenを使用するように、このMSBuild引数を渡す必要がありました。
/p:SGenToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools"
この問題が関連していることがわかりました: https://github.com/dotnet/sdk/issues/16
これが将来のバージョンで修正されるのを待っている間に、 https://github.com/joperezr が示唆するように、csprojファイルに2つのターゲットを追加することで問題を解決できました。
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />
</Target>
<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />
</Target>
今日、この同じ問題に遭遇しました。プロジェクトは私のPCではビルドできませんが、他のPCではうまくビルドできます
私は最終的に次のようにして修正しました:
エラーのあるプロジェクトを右クリックして、プロパティに入りました
[ビルド]タブを選択し、最後のオプションである[シリアル化アセンブリの生成]に移動しました。これを[オフ]に設定すると、プロジェクトは正常にビルドされます。
私の場合、このエラーはx86/x64設定の無効な組み合わせによるものではなく、参照アセンブリがビルドサーバーにインストールされていない特定の.NETフレームワークバージョン(v4.5.1)をターゲットとするプロジェクトをビルドしようとしたためです。
次の2つの条件の組み合わせがエラーの原因でした。
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework
に、v4.5.1という名前のフォルダーがnot存在していました。 (v3.5、v4.0、v4.5を含むバージョン番号を持つ他のフォルダー、wereが存在しました。)修正は、ビルドサーバーに Windows 8.1用のWindowsソフトウェア開発キット(SDK) をインストールすることでした。インストールウィザードの「インストールする機能を選択する」ステップで、「。NET framework 4.5.1 Software Development Kit」のボックスを除くすべてのボックスをオフにしました。
そのインストールを実行すると、Reference Assemblies\Microsoft\Framework.NETFrameworkフォルダーに欠落しているv4.5.1フォルダーが作成され、ビルドが正常に実行されました。
コマンドラインからVSまたはMSBuildをビルドすると、SGENの「誤った形式」エラーが表示され、同様の問題が発生していました。私のプロジェクトはx64ですが、MSBuildは32ビットバージョンのツールの使用を主張しました。 (私の同僚の一部はVS 2015でビルドすることでこれを回避していますが、VS 2017のみをインストールしており、そのままにしておきたいです。)
診断ビルドの出力を見ると、SGENはSdkToolsPathパラメーターで指定されたディレクトリから実行されているように見えます(私にとってはC:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\
)。これは、TargetFrameworkSDKToolsDirectoryから割り当てられます。ターゲットファイルを見ると、これはSDK40ToolsPathからのものです。そして、それはMSBuildの.configファイルから設定されます。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe.config
(管理者権限が必要)を編集し、SDK40ToolsPathプロパティを設定してこれを解決しました
<property name="SDK40ToolsPath" value="$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.6.2\WinSDK-NetFx40Tools-x64', 'InstallationFolder', null, RegistryView.Registry32))" />
(注:64ビットOSのレジストリでこのパスを探している場合は、HKLM\SOFTWARE\WOW6432Node\Microsoftに移動してください...)
主な変更点は、もちろん64ビットツールを使用するためのx86からx64です。また、フレームワークを使用するものに変更しました(4.6.2)。このmayは、この変更が行われた状態で、64ビットプロジェクトおよびこのフレームワークにのみツールを確実に使用できることを意味します。それでも、これがこの問題にぶつかる人の助けになることを願っています。 (私はショックを受け、MSBuildがフレームワークとアーキテクチャに基づいてツールパスを自動的に変更しないことにがっかりしました。)
私の場合、ソリューションはDebugで正しくコンパイルされましたが、1つのプロジェクトのみでReleaseエラーが発生しました。
これを使用して https://social.msdn.Microsoft.com/Forums/en-US/13d3cc7a-88dc-476c-8a15-fa2d4c59e5aa/sgen-an-attempt-was-made-to-load-an- Assembly-with-an-incorrect-format?forum = netfx64bit 、プロジェクトを変更しましたPlatformTargetwho withx86Any CPUの問題。
ソリューションをMixed Platformで保守し、Releaseでコンパイルすることができました。
プロジェクトを4.0から4.5.2にアップグレードし、Microsoft .NET Framework 4.5.2 Developer Packをビルドサーバーにインストールしました。その後、動作しました。他のすべての.netバージョンの開発者パックがあります。
これと同じ問題があり、出力画面を表示すると詳細がわかりました。このことから、Target Frameworkはこのタイプのプロジェクトで許可されているよりも高いことがわかりました(SQL Server CLRプロジェクトを構築していました)。プロジェクトのターゲットフレームワークは4.0に設定されました。これを3.5に戻すと、問題が修正されました。
デイブ