我正在将我们的 Visual Studio 解决方案之一迁移到 .Net Core 5。它有两个项目:Visual Basic 中的 WinForms 应用程序(旧版)和 C# 中的类库。
我注意到为 WinForms 应用程序生成的 .config 文件的名称与以前的版本不同:以前是 {WinForms 应用程序名称}.exe.config,现在是 {WinForms 应用程序名称}.dll.config。
我尚未找到有关此名称更改的文档。
我担心的是我们的版本更新过程。在我们软件的每个新版本中,我们都会向 IT 操作人员提供 .exe 和 .dll 文件,并由他们进行设置以供使用。如果 .config 文件发生更改,我们还会为其提供注释,告诉他们要添加、删除或更新哪些节点。
现在,我不知道可执行文件是否可以与旧名称格式的配置文件一起正常工作。所以我进行了实验。首先,我更改 .dll.config 文件中某个键的值并直接启动 .exe。通常情况下,这些变化都会被考虑在内。然后我再次将 .dll.config 文件重命名为 .exe.config,并重新启动 .exe。这次,即使我再次更改 .exe.config 文件,应用程序也会使用初始值。
我还尝试手动重命名配置文件:简单地(并且可预见地)构建解决方案会创建一个新的 .dll.config 文件。
我使用 EntityFramework 5.0.13 组合了一个 .Net 5 for Windows 应用程序。
现在我们尝试在尚未安装 .Net 5 框架的特定服务器上运行它。管理服务器的好人告诉我,他们尝试安装新东西,但似乎无法使应用程序运行。可能需要重新启动服务器,但暂时无法完成。
所以我需要为我的应用程序使用较旧的目标框架。很好,所以我决定针对多个框架,同时添加 .Net Framework 4.8。在我的 .csproj 文件中,这相当于替换
<TargetFramework>net5.0-windows</TargetFramework>
Run Code Online (Sandbox Code Playgroud)
和
<TargetFrameworks>net5.0-windows;net48</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题。
不幸的是,EntityFramework 5.0.13 与 .Net Framework 4.8 不兼容。
所以我使用了旧版本 3.1.9(在我们的另一个项目上运行良好)。
需要一点说服力,但现在我的项目使用 3.1.9。(我相信,一旦我降级一些语句,它就会建立得很好Class variable = new();。if (variable is not null))
现在,我想知道的是,我可以让我的 .Net 5 目标框架再次使用 EntityFramework 5.0.13 而不是 3.1.9 吗?
现在,我的 .csproj 文件读取
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.9" />
Run Code Online (Sandbox Code Playgroud)
在我开始使用多个目标框架之前,这是
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.13" />
Run Code Online (Sandbox Code Playgroud)
有没有办法添加属性PackageReference(或将其替换为另一个节点),以便它仅针对特定框架?
我的一位同事正在使用ObsoleteAttribute尚未实现的方法,因此我们在编译时收到警告。
然而,由于要实现的方法与过时的方法完全相反,这让我很烦恼。
NotYetImplementedButPleaseBePatientWeVeGotLoadsOfOtherThingsToDoAsWellAttribute我在文档中没有看到 a ,所以我想也许我们可以创建一个。
ObsoleteAttribute是sealed,所以我们不能继承它。(是的,我在尝试时发现了这一点。很好的尝试,我。)
有没有其他方法可以模仿ObsoleteAttribute,但有一个更合适的名字?
我们的内部框架使用通用类DBField<T>来模拟具有与实体框架不兼容的数据库(例如 Oracle 11 或 Sybase)的实体字段。
我们试图使其尽可能透明(再次,像实体字段一样),以便以下代码可以工作:
DBField<int?> z_intLength = 2;
while (z_intLength <= 5)
{
z_intLength++;
}
//[...]
DBField<int?> z_intMaxLength = 10;
if (z_intLength > z_intMaxLength)
{
}
Run Code Online (Sandbox Code Playgroud)
上面的效果很好。我们使用了public static implicit operator DBField<T>(T value)and public static implicit operator T(DBField<T> value),以及覆盖==和其他比较运算符,以及实现IEquatable<DBField<T>>、IComparable和IComparable<DBField<T>>。
现在我们正在尝试进行DBField<T>NUnit 测试,在这方面我们还很陌生。
值得注意的是,我们正在尝试各种等效方案:
string z_strComment = "Comment";
_objOrder2.OrderComment = z_strComment;
//[...]
Assert.True("Comment" == _objOrder2.OrderComment);
Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment));
Assert.That(_objOrder2.OrderComment, Is.EqualTo("Comment"));
Assert.Equals("Comment", _objOrder2.OrderComment);
Run Code Online (Sandbox Code Playgroud)
前两个断言通过,后两个断言失败。
每个断言的内部运作似乎都有所不同。有人可以解释它是什么吗?
更准确地说,使用断点进行调试似乎表明Assert.That("Comment", Is.EqualTo(_objOrder2.OrderComment)) …