Functoid需要在GAC中?

时间:2017-02-15 10:31:43

标签: biztalk

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

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

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

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

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

那么,functoid组件需要在GAC中?麻烦的是,它引用了一个common.components程序集,这意味着它也需要是GAC,这让我回到了我不想要的地方!这是一个问题,因为下次构建代理尝试使用common.components的引用来构建项目时,它将使用" old"恰好在GAC中推出的版本,而不是最新版本刚刚从回购中撤出并与同一解决方案中的依赖项目并列。

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

2 个答案:

答案 0 :(得分: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)');"

答案 1 :(得分:0)

感谢@ Johns-305的答案 - 我正在思考这个问题!

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

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