From 91812babac1f18999ea836b310fd88dad7ea77ab Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 10 Jun 2026 19:46:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 75e21b0..585699f 100644 --- a/README.md +++ b/README.md @@ -26,17 +26,17 @@ **基础方法**: -通过右击底层库属性,点击调试,设置为可执行文件,路径修改为主项目的启动程序。就可以在底层库点击调试运行主项目调试,同时支持打断点和进行二进制兼容的更改 +在底层库项目的 `Properties/launchSettings.json` 文件中配置调试启动参数。可以通过 Visual Studio 右击底层库项目属性,点击调试,打开调试启动配置文件 UI 界面,选择启动方式为可执行文件,路径修改为主项目的启动程序。工具将自动读取 `launchSettings.json` 中首个 `commandName` 为 `Executable` 的配置项,从中获取 `executablePath` 作为主项目的可执行文件路径。配置完成之后就可以在底层库点击调试运行主项目调试,同时支持打断点和进行二进制兼容的更改。 -请注意,将使用首个可执行文件调试配置作为输出配置 +`launchSettings.json` 中可执行文件配置的路径支持相对路径,相对于当前底层库项目的输出文件夹。工具会从 `executablePath` 找到主项目的可执行文件,并将底层库的输出文件拷贝到该可执行文件所在的文件夹。 **高级方法**: -编辑底层库项目的 csproj 文件,添加下面代码 +编辑底层库项目的 csproj 文件,添加 `MainProjectExecutablePath` 属性直接指定主项目的可执行文件路径。此方法将覆盖基础方法的 `launchSettings.json` 配置: ```xml - 主项目的输出可执行文件 + 主项目的输出可执行文件 ``` @@ -44,11 +44,21 @@ ```xml - "C:\dotnet campus\Foo\bin\release\net5.0\Foo.exe" + "C:\dotnet campus\Foo\bin\release\net9.0\Foo.exe" ``` -以上主项目的输出文件夹支持相对路径,相对于当前底层库项目 csproj 的相对路径 +以上 `MainProjectExecutablePath` 支持相对路径,相对于当前底层库项目 csproj 的相对路径 + +### 多框架兼容性检查 + +当底层库项目使用多框架(``)时,工具会自动检查当前编译的目标框架与主项目可执行文件的框架是否兼容。兼容规则如下: + +- 主项目为 .NET Core / .NET 5+ 系列 → 仅拷贝 .NET Core / .NET 5+ 系列的输出 +- 主项目为 .NET Framework 系列 → 仅拷贝 .NET Framework 系列的输出 +- 跨系列框架(如 .NET Core 库拷贝到 .NET Framework 主项目)将自动跳过,不做拷贝 + +工具通过检测主项目可执行文件所在目录是否存在 `.runtimeconfig.json` / `.deps.json` 文件判断其框架类型。对于 .NET Framework 系列,工具还会进一步读取 `.exe.config` 文件中的 `supportedRuntime` 信息。 ## 推荐使用方法 @@ -60,7 +70,7 @@ ## 原理 -在软件运行的时候依然可以移动 dll 或 exe 的路径,而此工具将底层库项目的输出 dll 和 pdb 文件拷贝到主项目的文件夹或 MainProjectPath 设置的文件夹,将原本的 dll 和 pdb 重命名,然后通过调试的可执行文件方式启动主项目 +在软件运行的时候依然可以移动 dll 或 exe 的路径,而此工具将底层库项目的输出 dll 和 pdb 文件拷贝到主项目可执行文件所在的文件夹(通过 `MainProjectExecutablePath` 或 `launchSettings.json` 获取),将原本的 dll 和 pdb 重命名为 `.bak` 文件,然后通过调试的可执行文件方式启动主项目 此时的主项目将会加载新的 dll 文件,同时因为存在 pdb 文件也能进去代码调试 @@ -74,7 +84,9 @@ ## 细节 -默认仅有在 Debug 下开启此功能,如需在 Release 也开启,请通过设置 EnableUsingMSBuildCopyOutputFileToFastDebug 属性为 true 开启 +### 启用控制 + +默认仅有在 Debug 下开启此功能,如需在 Release 也开启,请通过设置 `EnableUsingMSBuildCopyOutputFileToFastDebug` 属性为 `true` 开启: ```xml @@ -82,7 +94,15 @@ ``` -此项设置之后将会在 Debug 和 Release 下都开启复制 +此项设置之后将会在 Debug 和 Release 下都开启复制。 + +### 复制文件 + +工具默认将当前项目的输出 dll 和 pdb 文件(`$(AssemblyName).dll` 和 `$(AssemblyName).pdb`)拷贝到主项目可执行文件所在的文件夹。如需复制更多文件,可在项目文件中自行扩展 `OutputFileToCopy` 项组。 + +### 文件占用处理 + +目标文件夹如果已存在同名 dll 或 pdb 文件,工具会先将其重命名为 `{原文件名}{序号}.{扩展名}.bak`,再拷贝新文件。被重命名的 bak 文件会被记录到清理列表文件(位于 `$(IntermediateOutputPath)CleanUsingMSBuildCopyOutputFileToFastDebugFile.txt`),在执行 MSBuild Clean 目标时统一清理。 ## 感谢 From 8e165dce374f9c5667bde64bd03173629a2152a2 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 10 Jun 2026 19:52:11 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=20.NET=2011=20=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TargetFrameworkChecker.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Code/UsingMSBuildCopyOutputFileToFastDebug/TargetFrameworkChecker.cs b/Code/UsingMSBuildCopyOutputFileToFastDebug/TargetFrameworkChecker.cs index 14521db..7672818 100644 --- a/Code/UsingMSBuildCopyOutputFileToFastDebug/TargetFrameworkChecker.cs +++ b/Code/UsingMSBuildCopyOutputFileToFastDebug/TargetFrameworkChecker.cs @@ -175,6 +175,11 @@ private static DotNetType GetTargetFrameworkDotNetType(string targetFramework) return DotNetType.Net10; } + if (targetFramework.Contains("net11.")) + { + return DotNetType.Net11; + } + if (Regex.IsMatch(targetFramework, @"net\d")) { return DotNetType.NetCore; @@ -212,5 +217,6 @@ public enum DotNetType Net8 = 1 << 18 | NetCore, Net9 = 1 << 19 | NetCore, Net10 = 1 << 20 | NetCore, + Net11 = 1 << 21 | NetCore, } } \ No newline at end of file