Dynami c Загрузка сборок в генераторе T4 - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь динамически загрузить сборку в мой генератор T4. Я написал класс, который будет находить сборку в папке пакетов:

public static class DynamicModuleLoader
{
    public const string VERSION_GROUP_IDENTIFIER = "version";
    public const string DEFAULT_PACKAGE_LOCATION = "lib\\net45";
    public static void LoadLatestFromNugetPackages(string packageRootDir, string[] assemblyNames /*, bool usePreRelease = false*/)
    {
        foreach (var assemblyName in assemblyNames)
        {
            //var internalPattern = usePreRelease ? @"[\d]+[.\w-]*" : @"[\d.]+\\";
            var internalPattern = @"[\d]+[.\w-]*";
            //We need this regex to filter out other assemblies with similar names, as well as to parse versions
            var regexMatchPattern = $@"(?i){assemblyName}\.(?<{VERSION_GROUP_IDENTIFIER}>({internalPattern}))";
            var regex = new Regex(regexMatchPattern, RegexOptions.Compiled);
            var subDirectories = Directory.GetDirectories(packageRootDir, $"{assemblyName}.*")
                .Where(subDir => regex.IsMatch(subDir));

            var targetDir = subDirectories
                .OrderByDescending(subDir => regex.Match(subDir).Groups[VERSION_GROUP_IDENTIFIER].Value)
                .FirstOrDefault();

            var assemblyFullPath = $"{Path.Combine(targetDir, DEFAULT_PACKAGE_LOCATION)}/{assemblyName}.dll";
            Assembly.Load(assemblyFullPath);

        }
    }
}

В моем файле TT я пытаюсь динамически загрузить dll.

<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ import Namespace="System.Linq" #>
<#@ import Namespace="System.Collections.Generic" #>
<#@ import Namespace="System.IO" #>

<# DynamicModuleLoader.LoadLatestFromNugetPackages("$(SolutionDir)\\packages", new [] {"Services.Data" }); #>

<#@ import Namespace="Services.Data.Contracts" #>
<#@ import Namespace="Services.Data.Shared.Keys" #>
<#@ import Namespace="Services.Data.Enums" #>

Я подтвердил, что я предоставляю правильный путь к сборке, но я все еще получаю сообщение об ошибке:

Преобразование компиляции: имя типа или пространства имен 'Enums' не существует в пространстве имен 'Services.Data' (вы пропустили ссылка на сборку?) Apps.API.ServiceContracts C: \ source \ server \ Apps.API.ServiceContracts \ Data \ Models.tt 27

...