2015-11-06 47 views
1

我想将字符串转换为msbuild目标中的base64,但msbuild告诉我转换类型不可用。在MSBuild中将字符串编码为Base64

<ItemGroup> 
    <Headers Include="Authorization"> 
    <Content>$([Convert]::ToBase64String(&quot;user:password&quot;))</Content> 
    </Headers> 
</ItemGroup> 

somone能帮助我吗?

编辑:

找到一个解决办法,我不喜欢:

<UsingTask TaskName="ToBase64" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > 
    <ParameterGroup> 
     <In ParameterType="System.String" Required="true" /> 
     <Out ParameterType="System.String" Output="true" /> 
    </ParameterGroup> 
    <Task> 
    <Code Type="Fragment" Language="cs"> 
     Out = System.Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(In)); 
    </Code> 
    </Task> 
</UsingTask> 

<Target Name="WebRequest"> 
    <ToBase64 In="$(auth)"> 
    <Output PropertyName="authBase64" TaskParameter="Out" /> 
    </ToBase64> 
</Target> 

有没有更好的办法?

+1

你为什么不喜欢这个解决方案? – 0X0nosugar

+0

的oneliner和太多的代码,我愿做这样的事情: <的HTTPHeader包括= “授权”> <数据= “基本$(EncodeBase64("用户名:密码"))”/> dodjango

回答

2

你不能使用MSBuild属性函数来做任何你想做的事情。有一些限制,其中一个是只能使用几个名称空间。你有这里的整个列表:http://blogs.msdn.com/b/visualstudio/archive/2010/04/02/msbuild-property-functions.aspx

你的问题是,你需要System.Text.Encoding命名空间(以获得您的字符串的字节数组),这是不受支持的。

作为一个证明:

<ItemGroup> 
    <Headers Include="Authorization"> 
    <Content>$([System.Convert]::ToBase64String($([System.Text.Encoding]::Default.GetBytes("user:password"))))</Content> 
    </Headers> 
</ItemGroup> 


<Target Name="Deploy" > 
    <Message Text="@(Headers->'%(Content)')" Importance="high" /> 
</Target> 

失败error MSB4185: The function "Default" on type "System.Text.Encoding" is not available for execution as an MSBuild property function.

,但如果你设置环境变量MSBUILDENABLEALLPROPERTYFUNCTIONS = 1,那么它成功:

D:\set MSBUILDENABLEALLPROPERTYFUNCTIONS=1 
D:\>c:\windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe test.proj 
Project "D:\test.proj" on node 1 (default targets). 
Deploy: 
    dXNlcjpwYXNzd29yZA== 
Done Building Project "D:\test.proj" (default targets). 

出于维护的原因,我会建议您坚持使用您的详细任务方法,因为此环境变量不受支持。