【发布时间】:2021-01-15 23:11:26
【问题描述】:
我正在尝试从 C# DLL(最终从 PowerShell 加载)以编程方式运行 MSBuild,并作为命令行应用程序的第一步。我已按照推荐(或者我认为)使用 Microsoft.Build.Locator,将其 NuGet 包安装到我的项目中,并将以下引用添加到我的测试项目中:
<Reference Include="Microsoft.Build, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.Build.Framework, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.Build.Locator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9dff12846e04bfbd, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Build.Locator.1.2.6\lib\net46\Microsoft.Build.Locator.dll</HintPath>
</Reference>
项目面向.NET Framework 4.8,源码如下:
using Microsoft.Build.Evaluation;
using Microsoft.Build.Execution;
using Microsoft.Build.Locator;
using System.Collections.Generic;
namespace nrm_testing
{
class Program
{
static void Main(string[] args)
{
MSBuildLocator.RegisterDefaults();
DoStuff();
}
static void DoStuff()
{
using (var projectCollection = new ProjectCollection())
{
var buildParameters = new BuildParameters
{
MaxNodeCount = 1 // https://stackoverflow.com/q/62658963/3233393
};
var buildRequestData = new BuildRequestData(
@"path\to\a\project.vcxproj",
new Dictionary<string, string>(),
null,
new string[0],
null
);
var result = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequestData);
}
}
}
}
进入using 块后,我收到以下异常:
System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.'
Modules 窗口显示 MSBL 确实成功找到了我的 VS2019 安装:
Microsoft.Build.dll 16.07.0.37604 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Build.dll
Microsoft.Build.Framework.dll 16.07.0.37604 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Build.Framework.dll
Microsoft.Build.Locator.dll 1.02.6.49918 C:\dev\nrm3-tests\nrm\nrm-testing\.out\AnyCPU-Debug\Microsoft.Build.Locator.dll
System.Runtime.CompilerServices.Unsafe.dll 在版本 4.0.6.0(根据 DotPeek)中确实存在于定位的 MSBuild 程序集之外。
什么可能导致此错误,我该如何解决?
到目前为止我的尝试:
-
我找到了this question,但linked GitHub issue 仍然打开,我不确定是否是同一个问题。
-
我已经设法让绑定重定向工作,但我认为我不能在 DLL 中使用它们,所以这是一条死胡同。
-
将
System.Runtime.CompilerServices.UnsafeNuGet 包添加到项目(并验证它确实与项目的可执行文件一起复制)没有任何作用(感谢 magicandre1981 的建议)。 -
从 packages.config 切换到 PackageReference(由 Perry Qian 建议),行为没有改变。
【问题讨论】:
-
将 System.Runtime.CompilerServices.Unsafe 包直接添加到项目中
-
@magicandre1981 我刚试过——唉,没有任何改变。
-
在app.config add assemblyBinding System.Runtime.CompilerServices.Unsafe 的条目中
-
@magicandre1981 在我的测试应用程序中工作,但是手动绑定动态定位程序集的依赖项感觉就像一个巨大的黑客攻击。然而,真正的问题是库不能声明绑定重定向......我将研究我在其他地方找到的一种解决方法,它基于覆盖一个程序集加载器的回调。
-
这不是hack,这是正常的,VS在添加包时会自己这样做
标签: c# .net visual-studio msbuild visual-studio-2019