-2

このメソッドを呼び出すと、メモリが増加します (1M-3M):engine.ProcessTemplate(inputTemplate, host)。理由がわかりません。

注:私は t4 テンプレートを使用してコードを生成します。

これは私のコードです:

Engine engine = new Engine();
host.Session = new TextTemplatingSession();
 Parameter nameSpaceParameter = new Parameter() { Text = "NameSpace", Value = this.txtNameSpaceRoot.Text };//+ strTmp.Replace("Templates." + this.CurSelectedNode.DisplayName, string.Empty)
host.Session.Add("NameSpace", nameSpaceParameter);

Parameter tableNameParameter = new Parameter() { Text = "TableName", Value = oName.Substring(2)};
host.Session.Add("TableName", tableNameParameter);
string inputTemplate = File.ReadAllText(host.TemplateFileValue);
string content=engine.ProcessTemplate(inputTemplate, host);

これは私の t4 テンプレート ファイルです。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ parameter name="NameSpace" type="SmartCodeGenerator.Parameter" #>
<#@ parameter name="TableName" type="SmartCodeGenerator.Parameter" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using <#=NameSpace.Value#>.DAL;
using <#=NameSpace.Value#>.Model;
namespace <#=NameSpace.Value#>.BLL
{
    public class <#=TableName.Value#>Repository 
    {
        RepositoryBase<<#=TableName.Value#>Model> repository = null;
        public <#=TableName.Value#>Repository()
        {
            repository = new RepositoryBase<<#=TableName.Value#>Model>();

        }
        #region IRepository<T> 成员

        public <#=TableName.Value#>Model Create()
        {
            return repository.Create();
        }

        public <#=TableName.Value#>Model Update(<#=TableName.Value#>Model entity)
        {
            return repository.Update(entity);
        }

        public <#=TableName.Value#>Model Insert(<#=TableName.Value#>Model entity)
        {
            return repository.Insert(entity);
        }

        public void Delete(<#=TableName.Value#>Model entity)
        {
            repository.Delete(entity);
        }

        public IList<<#=TableName.Value#>Model> FindAll()
        {
            return repository.FindAll();

        }
        public List<<#=TableName.Value#>Model> QueryByPage<TKey>(Expression<Func<<#=TableName.Value#>Model, bool>> filter, Expression<Func<<#=TableName.Value#>Model, TKey>> orderby, int OrderType, int Take, int Skip, out int recordsCount)
        {
            recordsCount = repository.Query(filter).Count();
            if (OrderType == 0)
            {
                return repository.Query(filter).OrderBy(orderby).Take(Take).Skip(Skip).ToList();
            }
            else
            {
                return repository.Query(filter).OrderByDescending(orderby).Take(Take).Skip(Skip).ToList();
            }
        }

        #endregion
    }
}
4

1 に答える 1

0

ここで何があなたの懸念を引き起こしているのか、または VS Service インターフェイスを使用するのではなく、エンジンを直接インスタンス化する必要があるのはどのシナリオなのかわかりません。ただし、エンジンのインスタンス化が特定の VS プロセスで T4 メソッドを初めて呼び出す場合は、NGEN されたアセンブリにエラーが発生し、ワーキング セット ジャンプが発生します。ProcessTemplate への呼び出しの場合、これがシナリオで実際のパラメーター アセンブリを最初に使用する可能性があります。これ以上の文脈がなければ、それを伝えるのは少し難しいです。

于 2012-07-10T01:26:16.853 に答える