2014-05-09 19 views
5

Hem Visual Studio'dan hem de MSBUild'den göreceli olarak basit bir C# kodu oluşturmak için kullanılabilecek bir T4 şablonu oluşturmada sorun yaşıyorum. Şablon, projenin çıktı yolunda bulunan bir DLL'ye başvurur. Bunun dışında, alan nesnelerinin bir koleksiyonundan geçen ve her biri için bir test yöntemi çıkaran oldukça basit bir şablon.T4: Visual Studio ve MSBuild özelliklerini kullanma

MSDN suggests hem ana özelliklerini kullanmak için aşağıdaki yaklaşım:

<!-- Define a project property, myLibFolder: --> 
<PropertyGroup> 
    <myLibFolder>$(MSBuildProjectDirectory)\..\libs</myLibFolder> 
</PropertyGroup> 

<!-- Tell the MSBuild T4 task to make the property available: --> 
<ItemGroup> 
    <T4ParameterValues Include="myLibFolder"> 
     <Value>$(myLibFolder)</Value> 
    </T4ParameterValues> 
    </ItemGroup> 

Maalesef bu sadece çalışmaz.

Compiling transformation: Metadata file '$(myLibFolder)Cmc.SpeedWays.Core.Testing.dll' could not be found 

herkes bu sorunu çözmek için yönetmek veya en azından kabul edilebilir bir geçici çözüm buldunuz: MSBuild aracılığıyla yürütürken, ben şu hata alıyorum? VS2012 ve MSBUild 4.0 kullanıyoruz.

cevap

1

Aynı problemi yaşadım ve tek bir bariz düzeltme almadığım için üzgünüm. Ancak sorun ortadan kalktı, olası sorunların bir koleksiyonu gibi görünüyor.

Anahtar özellik, bu tür bir özellik bildiriminin yalnızca Visual Studio'yu kullanırsanız, MSBuild ile çözüm/proje oluşturduğunuzda işe yaradığını düşünüyorum. Bunun benim için karışıklık olduğunu düşünüyorum. Sonunda ben MsBuild özelliği ilan elde etmeye çalışmak benim şablonu içinde çağrıları ile sona erdi ve bu dize birleştirme aracılığı ile geçersiz dizeleri kuruyor dikkat etmek VS olarak

var configName = Host.ResolveParameterValue("-", "-", "configuration"); 
if (String.IsNullOrEmpty(configName)==true) 
{ 
    WriteLine ("// Generated from Visual Studio"); 
    IServiceProvider serviceProvider = (IServiceProvider)this.Host; 
    DTE dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
    configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
} 

Diğer şeyi başarısız olursa, kolay null

ile sona erecek