Как загрузить проект базы данных VS из приложения. NET Core? - PullRequest
0 голосов
/ 21 июня 2020

Существует проект базы данных сервера Visual Studio SQL с такими строками импорта внутри файла .sqlproj по умолчанию:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
  <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
  <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
  <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
</PropertyGroup>
<Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
<Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />

Хотя нет каталогов с SSDT для VisualStudioVersion 11.0, он правильно открывается из Visual Студия. Но при попытке загрузить проект из. NET Core приложения с помощью пакета Microsoft.Build выдает ошибку:

Импортированный проект «D: \ TestApp \ TestApp \ bin \ Debug \ netcoreapp3. 1 \ Microsoft \ VisualStudio \ v11.0 \ SSDT \ Microsoft.Data.Tools.Schema.SqlTasks.targets "не найден. Убедитесь, что выражение в объявлении импорта «D: \ TestApp \ TestApp \ bin \ Debug \ netcoreapp3.1 \ Microsoft \ VisualStudio \ v11.0 \ SSDT \ Microsoft.Data.Tools.Schema.SqlTasks.targets» является правильным, и что файл существует на диске.
D: \ Database1 \ Database1 \ Database1.sqlproj

Код для загрузки проекта выглядит как

var project = new Microsoft.Build.Evaluation.Project(@"D:\Database1\Database1\Database1.sqlproj");

1 Ответ

0 голосов
/ 23 июня 2020

Все, что я хочу, - это добавить некоторые элементы в проект с помощью метода AddItem, а затем сохранить его.

Как я уже сказал, вы можете игнорировать пропущенный импорт, и я считаю, что это будет предотвратить появление ошибок, для этого вы можете использовать следующую перегрузку конструктора Project :

public Project (string projectFile, System.Collections.Generic.IDictionary<string,string> globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings);

Установить loadSettings на IgnoreMissingImports:

/// <summary>
/// Flags for controlling the project load.
/// </summary>
/// <remarks>
/// This is a "flags" enum, allowing future settings to be added
/// in an additive, non breaking fashion.
/// </remarks>
[Flags]
[SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Justification = "Public API.  'Default' is roughly equivalent to 'None'. ")]
public enum ProjectLoadSettings
{
    /// <summary>
    /// Normal load. This is the default.
    /// </summary>
    Default = 0,

    /// <summary>
    /// Ignore nonexistent targets files when evaluating the project
    /// </summary>
    IgnoreMissingImports = 1,

    /// <summary>
    /// Record imports including duplicate, but not circular, imports on the ImportsIncludingDuplicates property
    /// </summary>
    RecordDuplicateButNotCircularImports = 2,

    /// <summary>
    /// Throw an exception and stop the evaluation of a project if any circular imports are detected
    /// </summary>
    RejectCircularImports = 4,

    /// <summary>
    /// Record the item elements that got evaluated
    /// </summary>
    RecordEvaluatedItemElements = 8,

    /// <summary>
    /// Ignore empty targets files when evaluating the project
    /// </summary>
    IgnoreEmptyImports = 16,

    /// <summary>
    /// By default, evaluations performed via <see cref="Project"/> evaluate and collect elements whose conditions were false (e.g. <see cref="Project.ItemsIgnoringCondition"/>).
    /// This flag turns off this behaviour. <see cref="Project"/> members that collect such elements will throw when accessed.
    /// </summary>
    DoNotEvaluateElementsWithFalseCondition = 32,

    /// <summary>
    /// Ignore invalid target files when evaluating the project
    /// </summary>
    IgnoreInvalidImports = 64,

    /// <summary>
    /// Whether to profile the evaluation
    /// </summary>
    ProfileEvaluation = 128,
}

Перечисление ProjectLoadSettings | перечисление ProjectLoadSettings [Github]

...