首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSBuild使用不正确的sgen.exe版本来生成XmlSerializer dll?

MSBuild使用不正确的sgen.exe版本来生成XmlSerializer dll?
EN

Stack Overflow用户
提问于 2011-03-09 21:22:59
回答 3查看 7K关注 0票数 6

我正在使用TeamCity运行一个MSBuild脚本来清理和重建我们的解决方案之一。当我部署由此进程构建的dll时,web服务器将返回一个关于MyType.XmlSerializer.dll的错误,即“此程序集是由比当前加载的运行时更新的运行时生成的,不能加载”。到目前为止,我的笔记如下:

  • 解决方案是针对.Net Framework3.5的Visual 2010解决方案。
  • TeamCity被设置为模仿该解决方案。它是用MSBuild版本- ".Net Framework4.0“和MSBuild ToolsVersion - "3.5”建立的。这告诉TeamCity使用MSBuild 4.0,但目标是3.5Framework。由于我们使用的是Visual 2010,所以我们必须使用MSBuild 4.0,否则它会产生其他错误(与VS2010使用的新警告代码相关)。dlls.
  • The 进程似乎工作正常,并为大多数.Net MSBuild进程生成.Net 3.5dll,调用resgen.exe和sgen.exe分别生成资源文件和XmlSerializer文件。由于我们使用的是Windows4.0,所以它查找WindowsSDK7.1。我已经安装了那个版本。我还拥有WindowsSDK7.0 installed.
  • No,不管我针对什么框架,构建过程在WinSDK 7.1下调用到sgen.exe,并生成.Net Framework4.0 MyType.XmlSerializer.dlls。这是correct?

吗?

据我所知,我的选择是:

  • ,如果我更改的目标是老版本的v3.5,MSBuild工具,VS2010已经在解决方案文件中放置了警告,MSBuild 3.5会阻塞并破坏构建。这实际上不是一个选项,
  • 试图将注册表中的路径更改为tools as discussed in this topic,我在服务器上没有看到VS2010。显然,VS2010使用了一个中间的WinSDK,v7.0A,他们唯一的方法就是在服务器上安装VS2010。这并不是真正的option.
  • Change,而是不生成XmlSerializer.dlls的项目。这是可行的,但看起来很俗气,因为它并没有真正解决问题,而且我还担心性能implications.

我是不是遗漏了什么?我还有别的选择吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-09 21:51:51

尝试将名为SGenToolPath的属性设置为要使用的SGen工具。

Microsoft.Common.targets文件调用SGen任务如下:

代码语言:javascript
复制
    <SGen
        BuildAssemblyName="$(TargetFileName)"
        BuildAssemblyPath="$(IntermediateOutputPath)"
        References="@(ReferencePath)"
        ShouldGenerateSerializer="$(SGenShouldGenerateSerializer)"
        UseProxyTypes="$(SGenUseProxyTypes)"
        KeyContainer="$(KeyContainerName)"
        KeyFile="$(KeyOriginatorFile)"
        DelaySign="$(DelaySign)"
        **ToolPath="$(SGenToolPath)"**
        SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)"
        EnvironmentVariables="$(SGenEnvironment)"
        SerializationAssembly="$(IntermediateOutputPath)$(_SGenDllName)"
        Platform="$(SGenPlatformTarget)"
        Types="$(SGenSerializationTypes)">

    <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly"/>

  </SGen>

我隐约记得在64位构建时必须这样做。如果您有任何问题,请添加注释。

票数 6
EN

Stack Overflow用户

发布于 2011-03-09 22:21:29

Windows有一个令人不快的历史安装程序问题。检查this answer以获得正确的注册表项。

票数 1
EN

Stack Overflow用户

发布于 2012-09-27 07:54:35

在我的机器上,我发现正确的版本被称为C:\Program (x86)\Microsoft DLL,但是目标DLL不正确。

我认为造成这种情况的原因是由于我的sgen.exe.config,删除以下行帮助解决了我的问题。

代码语言:javascript
复制
<startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5252340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档