我创建了一个新的 AWS Lambda .NET Core 3.1 项目,然后使用 AWS Lambda 测试工具运行它,然后我按预期得到了这个页面:
但是,如果我安装这些软件包之一:
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.Data.SqlClient
当我运行时,出现此错误并且无法打开测试页面:
AWS .NET Core 3.1 Mock Lambda Test Tool (0.10.0)
Unknown error occurred causing process exit: Dependency resolution failed for component C:\Users\siri\repos\bolao-futebol\website-core\AWSLambda1\bin\Debug\netcoreapp3.1\AWSLambda1.dll with error code -2147450740. Detailed error: Error:
An assembly specified in the application dependencies manifest (AWSLambda1.deps.json) was not found:
package: 'runtime.win-x64.runtime.native.System.Data.SqlClient.sni', version: '4.4.0'
path: 'runtimes/win-x64/native/sni.dll'
at System.Runtime.Loader.AssemblyDependencyResolver..ctor(String componentAssemblyPath)
at Amazon.Lambda.TestTool.Runtime.LambdaAssemblyLoadContext..ctor(String lambdaPath) in C:\codebuild\tmp\output\src142363207\src\Tools\LambdaTestTool\src\Amazon.Lambda.TestTool\Runtime\LambdaAssemblyLoadContext.cs:line 28
at Amazon.Lambda.TestTool.Runtime.LocalLambdaRuntime.Initialize(String directory, IAWSService awsService) in C:\codebuild\tmp\output\src142363207\src\Tools\LambdaTestTool\src\Amazon.Lambda.TestTool\Runtime\LocalLambdaRuntime.cs:line 71
at Amazon.Lambda.TestTool.Runtime.LocalLambdaRuntime.Initialize(String directory) …Run Code Online (Sandbox Code Playgroud) 我将System.MemoryNuget 包添加到我的net48Azure Function V1 项目中,为引用的包提供缺少的 dll netstandard2.0。但由于该包没有直接在我的代码中使用,因此 dll 不会复制到输出文件夹。
如何强制将System.Memory包的 dll 复制到构建时的输出文件夹?我已经尝试过<IncludeAssets>all</IncludeAssets>,但在某些情况下这只会将 dll 复制到输出文件夹(例如重建项目)。但是,如果我运行 Azure Function 调试器,这些 dll 会再次从输出文件夹中删除。
从.NET API 目录中,我了解到Microsoft.Win32.Registry该类是在.NET Standard + Platform Extensions 2.0程序集的包中声明的Microsoft.Win32.Registry, Version=4.1.1.0, PublicKeyToken=b03f5f7f11d50a3a。
我创建了一个面向 .NET Standard 2.0 的类库,这是一个简单的类:
public class NetStandardClass
{
public string GetHklmRegValue()
{
var lmKey = Microsoft.Win32.Registry.LocalMachine;
var softwareKey = lmKey.OpenSubKey("Software");
return "value";
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个 .NET Framework 4.7.2 控制台应用程序,它引用了我上面的类库:
class Program
{
static void Main(string[] args)
{
string value = new ClassLibrary2.NetStandardClass().GetHklmRegValue();
}
}
Run Code Online (Sandbox Code Playgroud)
当我在 Windows 上运行它时,这会引发一个运行时异常:
System.IO.FileNotFoundException: '无法加载文件或程序集 'Microsoft.Win32.Registry, Version= 4.1.3.0 , Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a ' 或其依赖项之一。该系统找不到指定的文件。'
根据我所读到的内容,在这种情况下出现程序集加载问题在某种程度上是一个已知问题。规定的解决方法是启用 …
我有这三个项目:
1 和 3 都参考 2。我刚刚用一个针对 .NET Standard 的新类库替换了旧的 .NET Framework 类库。类库使用Microsoft.EntityFrameworkCore.ProxiesNuGet包。
一切构建都没有错误,我的单元测试全部运行,并且 ASP.NET Core 应用程序运行没有问题。我的问题是,用于更新数据库的控制台应用程序构建、运行,但在初始化DbContext构造函数中的这一行时遇到运行时错误:
ChangeTracker.LazyLoadingEnabled = false;
说它无法加载程序集Microsoft.EntityFrameworkCore.Proxies。经过调查,我发现该Microsoft.EntityFrameworkCore.Proxies.dll文件不在控制台应用程序或类库项目的构建输出中。类库项目输出中唯一的 .dll 是项目 .dll 本身,旧的 .NET Framework 版本在输出中也包含所有 NuGet 包 .dll,并且使用数据库更新工具运行良好。
在 .NET 标准库的输出中包含依赖项是否需要额外的东西?
我有3个项目的Visual Studio解决方案。
顶层是.NET Framework 4.6.1控制台应用程序(项目A)。它取决于.NET Framework 4.6.1类库(项目B)。项目B依赖于.NET Standard 2.0类库(项目C)。
I have some code in Project C that uses System.Data.SqlClient (NuGet package version 4.6.1).
Due to the following known issue https://github.com/dotnet/sdk/issues/901 I have also added System.Data.SqlClient as a NuGet dependency to Project B (the .NET Framework Class Library).
This is Scenario 1, and when the solution is built, System.Data.SqlClient is copied to the /bin/Debug folder of Project A and the the application runs successfully.
The code for Scenario 1 is here …
我的情况是我有一个代码生成工具,它使用某些类库程序集作为输入。过去,我有一个本地“包”目录,NuGet 会将引用的包复制到该目录,我可以使用这些目录来查找程序集并使用它们作为输入运行代码生成器(或者我可以查看我的类的输出目录库,因为构建 .Net Framework 类库会将它引用的所有程序集文件复制到输出目录)。
现在,从只为 .Net Framework 开发切换到新的 .csproj 和 .Net Standard,NuGet 将包放在机器上的其他位置,其位置非常不透明,并且类库的构建不再处理程序集文件类库的输出文件夹的依赖项。
基本结构:SharedClassLibraryA
共享类库B
共享类库C
测试项目
我遇到的问题是构建非 .Net Framework 目标不会将依赖项所依赖的程序集文件复制到输出文件夹,因此我无法指向 SharedClassLibraryC 的输出文件夹来查找 SharedClassLibraryA 和 SharedClassLibraryB我的代码生成器的汇编文件作为输入。
此外,NuGet 包没有扩展到我的代码本地的文件夹中,所以我也无法通过那里获得程序集文件。(这需要知道版本号和包文件夹结构的其他详细信息。)
构建 .Net Framework 目标确实会将 SharedClassLibraryA 和 SharedClassLibraryB 的程序集文件复制到 SharedClassLibraryC 的输出目录中,以便适用于该目标。(不过,我想在某个时候删除 .Net Framework …
我有一个解决方案,其中大多数项目都是 VB.net 项目,所有项目都针对 .NET Framework 4.8。所有这些特定项目都可以正确编译并在生产中运行。
我添加了一个针对 .net standard 2.0 的 C# 项目。这个特定项目的主要原因是创建一个可以处理 razor 模板的组件(当然给定一个模型),以便使用 RazorLight_wik8wz nuget 包创建输出文件(我并不关心我使用哪个包,只要我可以在内存中渲染剃刀模板,因为模型/模板对生成的输出可能在不同情况下保留在不同位置)。
理论上,根据我的理解,我应该能够从其他 .net Framework 4.8 项目中引用和使用 .net standard 2.0 库项目。然而,我似乎无法让它工作(即使一切都编译并运行)。
我已经尝试了几种基于 RazorLight 的不同软件包,但当我尝试使用它们时,我得到了类似的结果。我只是不确定我是否遇到了错误或者我是否没有正确执行某些操作。
C# 项目名为“JobOutputGenerator”。我添加了名为“RazorLight_wik8wz”的 nuget 包,并创建了一个名为 JobOutput 的对象,当前如下所示:
using System.Threading.Tasks;
using RazorLight;
public class JobOutput
{
public static async Task<byte[]> CreateOutputAsync(string RazorTemplate, object Model)
{
RazorLightEngine engine = new RazorLightEngineBuilder().UseMemoryCachingProvider().Build();
return System.Text.Encoding.ASCII.GetBytes(await engine.CompileRenderAsync(RazorTemplate.GetHashCode().ToString() + Model.GetHashCode().ToString(), RazorTemplate, Model));
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了另一个名为“TesterApp”的项目,它是一个面向 .NET Framework 4.8 的 VB.NET 项目。这是一个引用 JobOutputGenerator 的简单 Windows 窗体项目。
我有一个按钮可以执行以下操作:
Private …Run Code Online (Sandbox Code Playgroud) 我在 .NET 解决方案中有一组 .NET 6.0 项目,其中一个是测试数据提供程序。我正在使用LiteDB来存储测试数据记录。该解决方案在本地构建良好并成功完成所有测试。我已经使用 GitHub Actions 在 GitHub 上设置了标准 CI 构建管道;构建完成时没有出现任何问题,并且不依赖于测试数据库的测试运行良好。
但是依赖于 LiteDb 数据库的测试无法运行,因为构建服务器在查找 LiteDb 程序集时似乎存在问题:
源“/home/runner/work/MyProject.Core/MyProject.Core/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll”的测试主机进程退出并出现错误:错误:找不到应用程序依赖项清单 (MyProject.Testing.Data.deps.json) 中指定的程序集:包:'LiteDB',版本:'5.0.16' 路径:'lib/netstandard2.0/LiteDB。 DLL'
大多数具有类似错误消息的文章都与 ASP.NET Core 相关,例如,未找到应用程序依赖项清单 (...) 中指定的程序集,但抓住了救命稻草,我尝试将以下内容添加到测试数据项目中:
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
Run Code Online (Sandbox Code Playgroud)
这没有什么区别。另一个SO答案(How do I get .NET Core items to copy NuGetreferences to the buildoutput?)建议将以下内容添加到.csproj:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
Run Code Online (Sandbox Code Playgroud)
这解决了缺少的依赖项,但引入了一个新的依赖项:
源“/home/runner/work/MyProject/MyProject/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll”的测试主机进程退出并出现错误:错误:An找不到应用程序依赖项清单 (testhost.deps.json) 中指定的程序集:包:'Microsoft.TestPlatform.CommunicationUtilities',版本:'15.0.0.0' 路径:'Microsoft.TestPlatform.CommunicationUtilities.dll'
(当然,我尝试添加 Microsoft.TestPlatform 作为依赖项,但这没有任何区别。)
为了完整起见,我确认 Linux 上支持 LiteDb,因为 GitHub Actions 服务在 Ubuntu 上运行 - 看起来那里没有任何问题。应用程序和所有程序集(和测试)都以 .NET 6.0 为目标,并且所有项目都设置为构建 AnyCPU。这是我的ci.yml文件,如果有帮助的话:
name: …Run Code Online (Sandbox Code Playgroud) 在我的解决方案中,我有一个顶级项目和一堆依赖项目。依赖项目之一需要引用 Nest nuget 包。因此,在解决方案的 nuget 包配置中,我仅将 Nest 安装在引用它的项目上。
顶级项目有对此依赖项目的引用,但没有对 Nest 命名空间的引用。它构建时没有警告或错误,但是,在运行时,我有一个问题说
Could not load file or assembly 'Nest, Version=7.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d' or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)
当我在顶级项目上手动安装 Nest 包时,它成功且没有问题。
为什么会出现这种情况?在依赖项目上安装 Nest 包不应该解决此依赖关系吗?
c# ×9
.net ×4
nuget ×3
.net-core ×2
.net-4.7.1 ×1
.net-4.8 ×1
aws-lambda ×1
binding ×1
dll ×1
vb.net ×1