Cannot use T4 templates inside a .NET Core project
Asked Answered
E

1

7

I have a .NET Core class library project and I want to use design-time T4 templates.

The tempalate compiles correctly, but when I try to use Reflection it raises an error

Running transformation: System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at Microsoft.VisualStudio.TextTemplating91FD7CCD92D7361F64265F0C5C220E81E842FC4A778C4D459155BDB3A79CCB52D465743E28886D98FF13456BEB0A44361D5237CFADD6B4BDEEED323B315D2F62.GeneratedTextTransformation.TransformText()
   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
   at CallSite.Target(Closure , CallSite , Object )
   at Microsoft.VisualStudio.TextTemplating.TransformationRunner.PerformTransformation()

This is my code:

<#@ output extension=".cs" hostspecific="false" #>
<#@ assembly name="$(TargetDir)$(Configuration)\netstandard1.6\MyProject.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>

<#@ import namespace="MyProject" #>

using System;
using System.Reflection;
namespace MyProject
{
    public class TestClass
    {
        public static void Method()
        {
            <#
                var type = typeof(Product);
                var properties = type.GetRuntimeProperties();
                // use properties here...

            #>
        }   
    }
}

I have added references to System.Runtime 4.1 using Nuget.

Englacial answered 5/10, 2016 at 16:45 Comment(0)
D
0

The cause of the problem is not the usage of System.Reflection, but your reference to the library MyProject.dll.

The T4 template engine is not able to reference libraries targeting the .NET Platform Standard. To reference your library, you need to add a target for the .NET Framework (e.g. net451 for .NET Framework 4.5.1) in the project.json of the referenced library.

"frameworks": {
    "net451": {},
    "netstandard1.6": {
        "imports": "dnxcore50"
    }

Then change the reference in your template to the added target framework.

<#@ assembly name="$(TargetDir)$(Configuration)\netstandard1.6\MyProject.dll" #>

becomes

<#@ assembly name="$(TargetDir)$(Configuration)\net451\MyProject.dll" #>
Doctrinal answered 17/10, 2016 at 9:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.