如何从 .NET Core 应用程序加载 VS 数据库项目?
How to load VS Database Project from .NET Core app?
默认情况下,.sqlproj 文件中有一个 Visual Studio SQL 服务器数据库项目,其中包含这样的导入行:
<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" />
虽然 VisualStudioVersion 11.0 没有带 SSDT 的目录,但它从 Visual Studio 正确打开。但是当尝试使用 Microsoft.Build 包从 .NET Core 应用程序加载项目时,它会抛出错误:
The imported project "D:\TestApp\TestApp\bin\Debug\netcoreapp3.1\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Confirm that the expression in the Import declaration "D:\TestApp\TestApp\bin\Debug\netcoreapp3.1\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" is correct, and that the file exists on disk.
D:\Database1\Database1\Database1.sqlproj
项目加载的代码看起来像
var project = new Microsoft.Build.Evaluation.Project(@"D:\Database1\Database1\Database1.sqlproj");
All I want is to add some items into the project using AddItem method
and then Save it.
正如我所说,您可以忽略遗漏的导入,我相信这将防止错误发生,为此您可以使用 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 Enum | ProjectLoadSettings Enum [Github]
默认情况下,.sqlproj 文件中有一个 Visual Studio SQL 服务器数据库项目,其中包含这样的导入行:
<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" />
虽然 VisualStudioVersion 11.0 没有带 SSDT 的目录,但它从 Visual Studio 正确打开。但是当尝试使用 Microsoft.Build 包从 .NET Core 应用程序加载项目时,它会抛出错误:
The imported project "D:\TestApp\TestApp\bin\Debug\netcoreapp3.1\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Confirm that the expression in the Import declaration "D:\TestApp\TestApp\bin\Debug\netcoreapp3.1\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" is correct, and that the file exists on disk.
D:\Database1\Database1\Database1.sqlproj
项目加载的代码看起来像
var project = new Microsoft.Build.Evaluation.Project(@"D:\Database1\Database1\Database1.sqlproj");
All I want is to add some items into the project using AddItem method and then Save it.
正如我所说,您可以忽略遗漏的导入,我相信这将防止错误发生,为此您可以使用 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 Enum | ProjectLoadSettings Enum [Github]