Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用release和debug dll创建nuget包';谁在使用nuget软件包资源管理器?_C#_Dll_Nuget Package - Fatal编程技术网

C# 如何使用release和debug dll创建nuget包';谁在使用nuget软件包资源管理器?

C# 如何使用release和debug dll创建nuget包';谁在使用nuget软件包资源管理器?,c#,dll,nuget-package,C#,Dll,Nuget Package,我正在使用Nuget软件包浏览器创建一些Nuget软件包。我在VS中以发布模式构建了一个项目,并向包中添加了dll和pdb文件 到目前为止还不错,但当我将包添加到另一个项目中,并尝试在调试时单步执行代码时,它会跳过它 我明白,如果我想在调试过程中逐步加入代码,我需要构建调试dll和pdb并将其添加到包中。我不知道如何将它们添加到我已经创建的包中,该包已经包含了版本dll和pdb文件,它们的名称相同 有什么想法吗?我的想法是,NuGet包装非常注重惯例 为不同的平台打包相同的名称空间和相同的名称没

我正在使用Nuget软件包浏览器创建一些Nuget软件包。我在VS中以发布模式构建了一个项目,并向包中添加了dll和pdb文件

到目前为止还不错,但当我将包添加到另一个项目中,并尝试在调试时单步执行代码时,它会跳过它

我明白,如果我想在调试过程中逐步加入代码,我需要构建调试dll和pdb并将其添加到包中。我不知道如何将它们添加到我已经创建的包中,该包已经包含了版本dll和pdb文件,它们的名称相同


有什么想法吗?

我的想法是,NuGet包装非常注重惯例

为不同的平台打包相同的名称空间和相同的名称没有问题(如
lib/net40/mydll.dll
lib/net35/mydll.dll
等),因为NuGet将按平台过滤注册的依赖项

为同一平台构建多个版本似乎很不传统,偏向于为每个构建生成一个包。这并不意味着你不能这样做,但你应该先问问自己是否应该这样做

也就是说,如果调试版本和发布版本非常不同(条件编译等),那么这可能会很有用。但最终用户在安装软件包时将如何选择发布或调试

一个想法是,每个构建配置一个版本。要做到这一点,请添加直接在目标项目文件中添加条件引用的内部版本或内部版本(不受支持,因为),如果您想要的不是MsBuild可以为您提供的任何基本功能

第一种策略的示例:创建一个.target文件(在包中,创建一个
build
文件夹,然后使用以下内容创建
build\YourLib.targets
):


..\packages\YourLib.1.0.0\lib\Debug\YourLib.dll
..\packages\YourLib.1.0.0\lib\Release\YourLib.dll

如果您创建了调试和发布文件夹(平台文件夹是可选的),构建输出将根据配置进行有效更改-前提是数据包使用者具有常规配置名称,但是你可以用@Tewr来扩展条件逻辑,或者把它放在自述文件包中。我发现了一个很麻烦但很有效的解决方案

创建具有以下文件结构的nuget:

lib\net\$(Configuration)\YourLib.1.0.0.dll    <---- put here some dummy file  named YourLib.1.0.0.dll
tools\release\YourLib.1.0.0.dll  <--- put here the release version
tools\debug\YourLib.1.0.0.dll  <--- put here the debug version
build\YourLib.targets  
lib\net\$(配置)\YourLib.1.0.0.dll感谢@Tewr采用新格式和sdk风格的csproj格式,我们可以使用一些常量作为
$(MSBuildThisFileDirectory)
来获取当前文件路径

<ItemGroup Condition="'$(Configuration)' == 'DEBUG'">
    <Reference Include="YourLib">
        <HintPath>$(MSBuildThisFileDirectory)..\lib\debug\YourLib.dll</HintPath>
    </Reference>
</ItemGroup>
使用该版本的代码将增加维护难度。sdk样式的csproj格式使用新的包格式,该格式不会将包文件输出到包文件夹

我们可以将目标文件添加到build文件夹,并使用
$(MSBuildThisFileDirectory)
获取文件路径

<ItemGroup Condition="'$(Configuration)' == 'DEBUG'">
    <Reference Include="YourLib">
        <HintPath>$(MSBuildThisFileDirectory)..\lib\debug\YourLib.dll</HintPath>
    </Reference>
</ItemGroup>

$(MSBuildThisFileDirectory)…\lib\debug\YourLib.dll

请参见

此答案应该引起关注。谢谢。@LeoLiu MSFT为什么?您想分享其他选择吗?我已经包含了.pdb文件(如中所述),并使用
-Prop Configuration=Release
构建了我的nuget软件包。我能够以很少的问题进入这段代码。此回答还确认可以针对具有.pdb文件的发行版dll进行调试:
<Reference Include="YourLib>   
    <HintPath>..\packages\YourLib.1.0.0\lib\net\$(Configuration)\YourLib.1.0.0.dll</HintPath>
    <Private>True</Private>
</Reference>
<ItemGroup Condition="'$(Configuration)' == 'DEBUG'">
    <Reference Include="YourLib">
        <HintPath>$(MSBuildThisFileDirectory)..\lib\debug\YourLib.dll</HintPath>
    </Reference>
</ItemGroup>