繁体   English   中英

如何不调试引用的 dll?

[英]How NOT to debug a referenced dll?

我正在使用其他项目中引用的 dll 的发布版本。 这个 dll 在调试器运行时具有篡改检测(dll 也是我的,我不打算做一些非法的事情),这会在调试时产生误报结果。

Visual Studio (2017-1019) 中是否有不“调试”引用 dll 的选项,但仍然能够调试正在开发的代码? “调试”意味着我不想介入这个特定的 dll,而只是从方法中获取数据,就像在 Release 中获取数据一样。

例如:

//Release dll
int Sum (int a, int b)
{
bool TamperingDetected = CheckForTampering();
if (TamperingDetected)
  return 0;
else
  return a + b;
}

//Other project
MessageBox.Show(dll.Sum(1, 1));

如果我在 Release 中运行这部分代码,我可以轻松获得正确的值。 不会检测到篡改,如果有人想对这种方法进行逆向工程,在 Release 中“合法”很容易做到。 如果我在 Debug 中运行,我将始终得到 0。如前所述,我不想在Sum方法中进行 Step-In,因此不应在此 dll 中进行调试,但其他一切都应该像在 Debug 中一样工作。

只是我的代码选项没有区别。

背景是一个团队创建了这个带有篡改检测的 dll,另一个团队将其用作 NuGet。 现在他们无法调试他们的代码部分,因为我们正在检测篡改并返回错误值。 对于其他团队来说,拥有源代码就太过分了,因为我们会冒着他们在构建他们不知道的那部分代码的过程中做错事的风险。

One option would be to give them Debug and Release dll's and they could switch between them like explained here: https://stackoverflow.com/a/7284102 , but then we lose the simplicity of sharing a NuGet and we still risk that Debug dll被复制而不是版本 dll,因此在最终产品中丢失了篡改检测。 NuGet 始终处于发布状态。

通过切换调试和发布配置来自动切换 NuGet 是不可能的,或者我仍然没有找到方法,但这也是一个不错的选择。 仅当使用一些完全其他的项目来下载调试和发布 NuGet,然后使用上面提到的答案,但我也不喜欢它。

由于执行我最初想做的事情的可能性很小,因此第二个最佳解决方案是在 NuGet 之间自动切换,这适用于 Choose-When-Otherwise。 PackageReference 或 ItemGroup 中的条件不起作用(至少在 VisualStudio 中,根据this )。 所以我将创建两个 NuGet,一个是带有篡改检测的 Release,另一个也是 Release,但没有篡改检测(此版本添加了“-debug”后缀)。 然后 NuGet 不会通过 NuGet 管理器安装,但只有 dllVersion 在.csproj 中更新:

<PropertyGroup>
  <dllVersion>1.2.3</dllVersion>
</PropertyGroup>
<Choose>
  <When Condition="'$(Configuration)'=='Debug'">
    <ItemGroup>
      <PackageReference Include="dllNuGet" Version=$(dllVersion)-debug/>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <PackageReference Include="dllNuGet" Version=$(dllVersion)/>
    </ItemGroup>
  </Otherwise>
</Choose>

看来要在Debug模式下根据某个开关来决定是否调试dll。

显然,你给出的方法是有问题的。 毕竟是基于项目当前的配置。 启用发布模式后,您将无法调试主项目的代码。 本质上,您仍然想调试代码。

但是,禁用Tools --> Options --> Debugging --> General下的Enable Just My Code选项将使您在Release模式下调试代码。 但这不是一个完美的调试模式,有时我无法命中断点,无法进一步调试,不推荐。

我有两个解决方案:

==================================================== ===

提示一)直接使用组件 dll 而不是 nuget

1)创建一个名为Debug_NotDLL的新配置,它继承调试模式。 在此处输入图像描述

另外,制作两个DebugRelease模式的 dll。

2)将这些添加到csproj文件中:

 <Reference Include="test" Condition="'$(Configuration)'=='Debug'">
      <HintPath>..\test\bin\Debug\xxx\xxx.dll</HintPath>
    </Reference>
    <Reference Include="test" Condition="'$(Configuration)'=='Debug_NotDLL'">
      <HintPath>..\test\bin\Release\xxx\xxx.dll</HintPath>
 </Reference>

然后,您可以切换DebugDebug_NotDLL配置以获得您想要的。

==================================================== ==

技巧二)使用nuget

创建新的 package,在这种情况下,我建议您应该使用网络标准 class 库项目。

我建议您可以创建两个 nuget package 的 dll。

最好将Release模式的 dll 重命名为xxx_Release.dllxxx_Debug.dll为 Debug 模式。

要创建发布 nuget package ,您应该在发布模式下直接右键单击 lib 项目->单击Pack 要重命名 nuget package,您可以使用PackageId msbuild 属性将其名称设置为csproj xxx_Release 检查这个文件

注意,如果在本地机下创建nuget package,则始终可以输入nuget源代码,因为当前机上有项目源代码的缓存。 这是一种特殊情况。 所以你应该在另一台机器上测试 nuget package。

To create a debug nuget package , the dll and pdb file is not enough, you should also add the source files into the nuget package.

然后,在Debug模式下打包这样的nuget package调用xxx.Debug.xxxnupkg 这是关于创建调试nuget package的步骤的一个链接两个链接

完成后,您可以安装这两个 nuget 包,并将它们添加到主项目下,

<ItemGroup>
    <PackageReference Include="xxx.Debug" Version="1.0.0" Condition="'$(Configuration)'=='Debug'" />
  <PackageReference Include="xxx.Release" Version="1.0.0" Condition="'$(Configuration)'=='Debug_NotDLL'" />
 </ItemGroup>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM