【问题标题】:Functoids need to be in the GAC?Functoids 需要在 GAC 中吗?
【发布时间】:2017-02-15 10:31:42
【问题描述】:

我希望我在这里忽略了一些东西,但我遇到了一个问题,我找不到一个快乐的解决方法。

我将 VSTS 用于我的 CI 解决方案。每次提交时,BizTalk 应用程序都会被提取到专用的构建服务器、编译并执行单元测试。

我不希望我的任何 BizTalk 解决方案程序集进入构建服务器上的 GAC,因为 Visual Studio 将使用这些而不是项目引用进行编译。

当构建代理尝试构建包含自定义 functoids 项目的解决方案时出现问题,我收到以下错误:

未找到 Functoid:guid (1d5de785-c639-4040-9704-c65a11127115) 和 functoid id (6003)。检查实现此 functoid 的程序集是否存在于 D:\Program Files (x86)\Microsoft BizTalk Server 2013 R2\Developer Tools\Mapper Extensions 中。如果 functoid 没有公开任何内联代码,请确保其程序集在 GAC 中也可用

那么,functoid 程序集需要在 GAC 中吗?麻烦的是,它引用了一个 common.components 程序集,这意味着它也需要经过 GAC 处理,这让我回到了我不想去的地方!这是一个问题,因为下次构建代理尝试构建一个引用 common.components 的项目时,它将使用恰好在 GAC 中出现的“旧”版本,而不是刚刚从 GAC 中提取的最新版本repo 并与依赖项目放在同一个解决方案中。

如果其他人遇到同样的问题,我很乐意听取您的意见。

【问题讨论】:

  • 我要说正确的解决方案是更新 GAC,这是所有 BizTalk App 相关程序集应该始终存在的地方,这就是它的工作原理。 “似乎 BizTalk 项目将使用这些,而不是项目引用”,这就是 .Net 解决程序集的方式。与 BizTalk 没有任何关系。
  • 感谢您的回答@Johns-305,我同意大会决议与 BizTalk (msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.110).aspx) 无关。但是,需要在 GAC 中的 functoid 是导致此问题的原因。没有自定义functoid,没问题!如果 common.components 在 GAC 中,那么每次提交触发自动构建时,都会在构建服务器上引用“旧”版本。构建代理将从远程仓库获取 common.components 的最新代码,但依赖项目将使用 GAC 中的任何版本构建
  • 抱歉,我还是不明白这个问题。构建应该更新所有必要的东西。意思是,GAC 中不应该有任何东西的“旧”版本。它们也应该在构建时得到更新,无论是自然地还是作为特定的构建步骤。
  • 啊,所以在 VS 中有一个后期构建步骤,用于 common.components 项目来更新 GAC。我认为这可以工作!我试试看

标签: biztalk


【解决方案1】:

我通常在我的 BizTalk 相关项目中添加以下内容作为构建后步骤:

call "$(DevEnvDir)..\tools\vsvars32.bat"
gacutil.exe /if "$(TargetPath)"

我很确定$(DevEnvDir) 不会在构建服务器上解析。有一些解决方法 - 您可以确保安装 Windows SDK 并设置正确的注册表项(如此处Running MSBuild fails to read SDKToolsPath),或者您可以在具有 gacutil 路径的构建服务器上设置环境变量,或者您可以使用具有 GacUtil 任务的 MSBuild 社区任务 (https://github.com/loresoft/msbuildtasks) 之类的东西,或者甚至可以像这样运行 powershell 脚本:

#Note that you should be running PowerShell as an Administrator
[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")            
$publish = New-Object System.EnterpriseServices.Internal.Publish            
$publish.GacInstall("C:\Path\To\DLL.dll")

(来自https://www.andrewcbancroft.com/2015/12/16/using-powershell-to-install-a-dll-into-the-gac/)。

请注意,构建过程需要以(本地)管理权限运行才能成功 GAC 库。

编辑:由于我在本地遇到了这个问题,所以我已经使用它并且它适用于我测试过的每个环境(无论安装了哪个 windows SDK 或者机器的管理员是否将它放在 C 、D 或其他驱动器...):

powershell -c "[System.Reflection.Assembly]::Load('System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'); $publish = New-Object System.EnterpriseServices.Internal.Publish; $publish.GacInstall('$(TargetPath)');"

【讨论】:

    【解决方案2】:

    感谢@Johns-305 的回答——我想多了!

    我添加了以下内容作为 Common.Components 项目的构建后事件:

    "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe"  /i "$(TargetPath)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2013-10-25
      • 2011-03-05
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多