我已经“继承”了一个新的(旧的?)Winforms项目,并希望将它放到我们的构建服务器(Bamboo)上。该构建服务器只安装了绝对最小值(.NET 3.5,而不是更多),我们希望保持这种状态。
作为第一步,我将Infragistics组件的所有程序集文件(* .dll)解压缩到一个单独的目录中,并从该本地目录引用它们(而不是依赖它们安装在GAC中)。工作正常。
但是当我尝试在Bamboo上运行这个版本时(使用MSBuild),我不断收到错误:
Properties \ licenses.licx(1):错误 LC0004:创建异常 类型 “Infragistics.Win.UltraWinToolbars.UltraToolbarsManager, Infragistics2.Win.UltraWinToolbars.v7.2, 版本= 7.2.20072.61,文化=中性, 公钥= 7dd5c3163f2cd0cb” System.ComponentModel.LicenseException
经过一些谷歌搜索后,似乎项目中的那些licenses.licx
文件是某种许可方案,以防止工具安装在多台机器上。
但是如何摆脱那些以便我的构建服务器构建工作,没有将完整的Infragistics组件集安装到构建服务器上(这是不选项)...
嗯.....经典捕获22 - 任何出路?
答案 0 :(得分:24)
我找到解决这个问题的唯一方法是:
licenses.licx
licenses.licx
复制到各个项目'licenses.licx
目录中的所有现有Properties
有了这个,现在我的两个交互式体验都在工作(因为存在正确的licenses.licx
文件),但我的自动构建也没有中断(因为我复制了那个空的licenses.licx
文件所有真实的都不会导致构建中的任何中止)
似乎有点hackish - 但它确实有效。希望有一天能在某个地方帮助别人。
更新:我将此BeforeBuild
步骤添加到我的MSBuild构建文件中,将空*.licx
文件复制到我需要的位置:
<Target Name="BeforeBuild">
<CreateItem Include="licenses.licx">
<Output TaskParameter="Include" ItemName="EmptyLicensesLicx" />
</CreateItem>
<Copy SourceFiles="@(EmptyLicensesLicx)"
DestinationFolder="(your-target-folder-here)"
ContinueOnError="true" />
</Target>
由于我需要在几个地方替换这个* .licx文件,我实际上有几个<Copy>
任务来实现我的目标。
答案 1 :(得分:3)
我们有来自其他公司的组件,但如果在第三方库中使用.Net licensing model,该方法应该有效。
如果您有licenses.licx
文件,则库可能会使用.Net licensing model。在构建过程中,它使用lc.exe实用程序来构建二进制许可证文件,然后将其作为嵌入式资源包含在程序集中。
您需要做什么:
YourApp.exe.licenses
文件。其他方法是构建包含licenses.licx
的解决方案,并从obj\Debug
或obj\Release
目录中获取。此步骤应在安装和注册组件的机器上完成。此外,它可能需要输入许可证代码,如我们的情况。YourApp.exe.licenses
添加到项目中作为嵌入资源。打开应用程序的.csproj并编辑YourApp.exe.licenses
文件的条目。你会有这样的事情<EmbeddedResource Include="YourApp.exe.licenses" />
它应该改为
<EmbeddedResource Include="YourApp.exe.licenses" >
<LogicalName>YourApp.exe.licenses</LogicalName>
</EmbeddedResource>
需要从资源名称中排除名称空间。
我不确定lc.exe是如何工作的,但您可能需要不时重建YourApp.exe.licenses
文件。
答案 2 :(得分:0)
我可以根据marc_s的答案建立Team City项目,即用空白licenses.licx替换现有的许可证文件。
但是当我尝试在本地计算机上打开具有infragistics控件的aspx页面时,又出现了另一个问题,因为我在本地计算机上安装了infragistics,但我的licenses.licx是空白的,这会产生错误。
我找到了一个解决方法,如下所示:
<Target Name="BeforeBuild" Condition="$(Configuration)==CI_TeamCity_Build">
<CreateItem Include="$(MSBuildProjectDirectory)\licenses.licx">
<Output TaskParameter="Include" ItemName="EmptyLicensesLicx" />
</CreateItem>
<Copy SourceFiles="@(EmptyLicensesLicx)" DestinationFolder="$(MSBuildProjectDirectory)\Properties\" ContinueOnError="true" />
</Target>
添加&#39; BeforeBuild&#39; marc_s提到的目标另外我添加了一个条件,当我的构建使用&#39; CI_TeamCity_Build&#39;时,将执行此任务。而不是为了调试&#39;或者&#39;发布&#39;构建
Team City构建配置在&#34; VS解决方案构建运行器&#34;中使用上述配置。步。由于&#39; BeforeBuild&#39;在csproj文件中的目标,它用空白替换许可文件并构建成功。
在我的本地计算机上,我继续使用&#39; Debug&#39;或者&#39;发布&#39;构建,因为它不会用空白替换licenses.licx文件。所有infragistics控件都出现在.aspx页面上,没有任何问题。
答案 3 :(得分:0)
我最近使用TeamCity 9.1作为我的构建服务器遇到了这个问题。
当我们最初设置构建服务器时,我们不想在机器上安装Infragistics,因此我们创建了一个References文件夹,我们复制了所需的程序集并将其签入。(我知道这是不可取的但是它是一种解决方法。)
确保项目引用新路径中的程序集。这会在每个程序集的项目文件中创建一个HintPath条目。
最后,手动编辑项目文件以添加 &LT;私人和GT;真&LT; /私人和GT;每个参考。 (将Copy Local属性设置为true并不足够。)
答案 4 :(得分:0)
为了补充上面的答案(即通过创建一个空的licenses.licx文件来解决问题),您可以安装EmptyLicensesLicx nuget包,它将在您的项目中生成一个空的Licenses.licx
,在每次编译之前(这就是你需要它才能工作)。