Я создаю утилиту, которая использует библиотеки 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.