Принудительная загрузка пространства имен .Extensions, когда это потребуется встроенной DLL. - PullRequest
0 голосов
/ 10 октября 2018

Я создаю утилиту, которая использует библиотеки Microsoft DACPAC.Для целей этого инструмента я хочу встроить все необходимые библиотеки в исполняемый файл.Похоже, что когда я выполняю DacServices.GenerateDeployScript(), он пытается использовать библиотеку Microsoft.SqlServer.Dac.Extensions.Библиотека также встроена, но, возможно, не решается с моим EventHandler, как другие DLL.Мой EventHandler выглядит следующим образом:

private static Assembly ResolveEventHandler(Object sender, ResolveEventArgs args)
    {
        //Debugger.Break();
        String dllName = new AssemblyName(args.Name).Name + ".dll";

        var assem = Assembly.GetExecutingAssembly();
        String resourceName = assem.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
        if (resourceName == null) return null;
        using (var stream = assem.GetManifestResourceStream(resourceName))
        {
            Byte[] assemblyData = new Byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        }
    }

Это работает для разрешения других элементов, но я считаю, что вероятная проблема заключается в том, что пространство имен Microsoft.SqlServer.Dac выполняет вызов времени выполнения к пространству имен .Extensionsи не может разрешить пространство имен или методы в нем.Я могу ошибаться, но я не уверен, что еще может быть причиной.

Вызовы методов и классов в самом .Dac обрабатываются нормально, поэтому я знаю, что EventHandler работает правильно,Я не совсем уверен, что делать, и буду признателен за любые рекомендации.Я пробовал using Microsoft.SqlServer.Dac.Extenions в верхней части файла .cs, но поскольку я ничего не вызываю напрямую в этом пространстве имен, он серый и, вероятно, игнорируется компилятором.

Спасибо!

Обновление:

Я сделал вызов к пространству имен .Extensions в коде, чтобы заставить его считываться в память перед ошибочным вызовом, хотя кажется, что он ужебыло.Я установил точку останова, где решатель запускается.Непосредственно перед тем, как происходит сбой, он пытается разрешить .resource для каждой DLL, например, Microsoft.SqlServer.Dac.resource и Microsoft.SqlServer.TransactSql.ScriptDom.resource - все для DLL, встроенных в исполняемый файл.Средство распознавания ничего не видит, потому что в проекте нет файлов .resource, поэтому в манифест ничего не скомпилировано.Разве они не должны находиться в памяти, пока используется DLL?Когда все библиотеки DLL находятся в том же каталоге, что и файл .exe, он работает нормально, а также не создает временных файлов .resource в каталоге, поэтому я не уверен, что мне нужно решить.

Обновление 2:

При использовании PDB библиотек DAC возникает ошибка:

IOperation operation = DacServices.CreateDeploymentArtifactGenerationOperation(OperationResources.GenerateDeployScriptCaption, (ErrorManager errorManager) => this.CreatePackageToDatabaseDeployment(package.PackageSource, targetDatabaseName, dacDeployOption, errorManager), (IDeploymentController controller, DeploymentPlan plan, ErrorManager errorManager) => DacServices.WriteDeploymentScript(streamWriter, controller, plan, errorManager), cancellationToken1, dacLoggingContext);

Ирезультирующие исключения:

The extension type Microsoft.SqlServer.Dac.Deployment.Internal.InternalDeploymentPlanExecutor could not be instantiated.

и

The extension type Microsoft.SqlServer.Dac.Deployment.Internal.InternalDeploymentPlanModifier could not be instantiated.

...