18

プロジェクトをVS2008からVS2010にアップグレードしましたが、3.5フレームワークをターゲットにしています。

プロジェクトファイルには、SGENを実行してXmlSerializers.dllを生成するカスタムタスクがあります。ただし、実行されているsgenのバージョンは4.0フレームワークを対象としています。その結果、アプリケーションを実行すると、次のエラーメッセージが表示されます。

「ファイルまたはアセンブリ'XXXX.XXXX.XmlSerializers'またはその依存関係の1つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。」

Sgenタスクは次のようになります。

  <Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
    <!-- Delete the file because I can't figure out how to force the SGen task. -->
    <Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
    <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
      <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
    </SGen>
  </Target>

ToolPath = "$(SGenToolPath)"があります。3.5を対象とするバージョンを実行するにはどうすればよいですか?

ここにも同様の質問がありますが、あまり役に立ちません。

4

5 に答える 5

18

古い(バージョン2.0.50727.3038)バージョンのsgen.exeを指すようにToolPathを手動で構成することで、これを解決しました。

私のマシンでは、これは次の場所にあります:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin

ToolPath属性を次のように変更しました。

ToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin"

これで問題は解決しました。

デフォルトでは、C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin \NETFX4.0ツールで新しい4.0フレームワークバージョンを実行しているようです。

これが他の誰かに役立つことを願っています。

于 2010-05-02T10:26:04.453 に答える
17

MSBuildはレジストリを使用して、v3.5ツールへのパスを取得します。3.5ツールへのパスを特定できない場合、v3.5 SDKツールを必要とするMSBuildタスクはv4.0パスにフォールバックします。C:\ Windows\MicrosoftでTargetFrameworkSDKToolsDirectoryプロパティを設定するために使用されるロジックを確認してください。本当に興味がある場合は、NET \ Framework \ v4.0.30319\Microsoft.NETFramework.props。

この問題は、次のように診断して修正できます。

Process Monitorをインストールし、msbuildによるレジストリアクセスを監視するフィルターを設定します(イベントクラス:レジストリ、プロセス名:msbuild.exe、すべての種類の結果)。

ビルドを実行します。

プロセスモニターで、「MSBuild \ ToolsVersions \ 4.0\SDK35ToolsPath」に一致するRegQueryValueアクセスを検索します。これは、「HKEY_LOCAL_MACHINE \ SOFTWARE\Microsoft」または「HKEY_LOCAL_MACHINE\SOFTWARE \ Wow6432Node\Microsoft」のいずれかにある可能性があることに注意してください。

レジストリ内のこのキーを見ると、別のレジストリ値をエイリアスしていることがわかります。たとえば、「$(Registry:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.1 \ WinSDK-NetFx35Tools-x86 @ InstallationFolder)」この直後に、「NAMENOTFOUND」という結果が表示される可能性があります。期待されるキーがどこにあるべきかを見ると、それらが要求されているキーと一致していないことがわかります(ハイフンがなく、「-86」で終わるキーがない可能性があります)。

何を修正する必要があるかが明確になっている必要があります。間違ったキーをエクスポートし、.regファイルを編集して実行し、正しいキーを作成することを選択しました。

無効なレジストリエントリの原因の1つは、MicrosoftSDKv7.1のインストールのバグである可能性があります。

http://connect.microsoft.com/VisualStudio/feedback/details/594338/tfs-2010-build-agent-and-windows-7-1-sdk-targeting-net-3-5-generates-wrong-embedded-資力

于 2011-04-18T10:43:52.310 に答える
7

これが最も簡単な方法であり、次のように機能します:<GenerateSerializationAssemblies> On </ GenerateSerializationAssemblies>

<SGenToolPath>C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin</SGenToolPath>
于 2010-12-14T21:19:52.950 に答える
7

問題は$(SGenToolPath)MSBuildによって設定されていません。を使用する$(TargetFrameworkSDKToolsDirectory)と、に基づいてパスを解決しようとします$(TargetFrameworkVersion)

printf()スタイルのデバッグにタグを利用すると便利です。以下を一時的に追加します。

<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
  <Message Text="SGenPath: $(SGenPath)" Importance="high"/>
  <Message Text="TargetFrameworkVersion: $(TargetFrameworkVersion)" Importance="high"/>
  <Message Text="TargetFrameworkSDKToolsDirectory : $(TargetFrameworkSDKToolsDirectory )" Importance="high"/>
于 2012-07-12T14:43:35.207 に答える
5

@Craig-ビルドマシンに7.0Aフレームワークを手動でインストールしましたか。その場合、問題はレジストリ設定であり、msbuildではない可能性があります。LocalMachine-> Software-> Microsoft-> MSBuild-> ToolsVersions-> 4.0-> SDK35ToolsPathを見て、そこで参照されているregキーが有効であることを確認してください。(ヒント:-x86キーが存在する場合にのみ、-x86が存在することを確認してください。)

于 2010-06-30T19:14:18.413 に答える