小编And*_*ens的帖子

Azure Devops Nuget 还原失败并显示“无法加载源的服务索引”

我们有一个内部 Azure DevOps 2019 服务器,我目前正在为新的 .Net6 解决方案设置构建,该解决方案的项目引用来自 nuget.org 的各种包以及我们 ADO 服务器“工件”区域中的内部源。

由于这是 .Net6,我假设我必须使用“.Net Core”恢复任务(黑色方形图标),而不是旧的“NuGet”恢复任务(蓝色图标)?因此,我添加了前者,并配置了相关设置,如下所示,其中“NuGetPackages”是我们内部源的名称:

在此输入图像描述

当我运行构建时,此任务失败并显示消息

错误 NU1301:无法加载源 http://***/_packaging/2df3c440-07a5-4c01-8e5c-bfbd6e132f09/nuget/v3/index.json 的服务索引。

我们内部 feed 的 URL 是: http://***/_packaging/NuGetPackages/nuget/v3/index.json,那么为什么 URL 中的 feed 名称被替换为错误消息中所示的 GUID?大概这就是恢复失败的原因。

顺便说一句,我们有许多 .Net Framework 4.x 解决方案,它们引用相同的包并且构建得很好。这些使用较旧的“NuGet”(蓝色图标)恢复任务,但设置与上图中的设置相同,这表明较新的“.Net Core”任务正在做一些奇怪的事情。

(顺便说一句,有人可以解释“NuGet”任务和“.Net Core”任务之间的区别吗?我仍然可以在 .Net6 构建管道中使用旧任务吗?我之前曾短暂尝试过,但它抱怨 msbuild v17尚未安装,并且不想继续沿着这条路走,因为担心破坏 4.x 版本)。

nuget-package-restore azure-devops azure-pipelines

5
推荐指数
2
解决办法
2万
查看次数

尝试在长时间运行的操作期间在WPF中显示"请稍候"消息

我的XAML中有一个属性绑定到我的ViewModel上的属性(实现).一个单独的按钮启动一个长时间运行(2-3秒)的过程,如下所示:please wait TextBlockVisibilityIsBusyINotifyPropertyChanged

IsBusy = true;

try
{
    // Do some long-running process
}

finally
{
    IsBusy = false;
}
Run Code Online (Sandbox Code Playgroud)

但这条please wait消息从未出现过.我假设操作在UI线程上运行,因此没有给它刷新的机会?如果我在一个单独的线程上运行上面的代码,它确实有效,但我不希望用户在操作运行时做任何事情 - 我很高兴用户界面freeze.

如何显示please wait 消息?或者我会更好地在后台线程上运行它并(以某种方式)锁定UI持续时间?我正在使用.Net 4顺便说一句.

c# wpf visibility textblock inotifypropertychanged

4
推荐指数
1
解决办法
3352
查看次数

Validation.ErrorTemplate 大小

我有以下控件模板,用作Validation.ErrorTemplate文本框:-

<ControlTemplate x:Key="ControlValidationErrorTemplate">
  <DockPanel LastChildFill="True">
    <Border Background="Red"
            DockPanel.Dock="right"
            Padding="2,0,2,0"
            ToolTip="{Binding ElementName=valAdorner, Path=AdornedElement.(Validation.Errors), Converter={x:Static val:ValidationErrorsConverter.Instance}}">
      <TextBlock Text="!"
                 VerticalAlignment="center"
                 HorizontalAlignment="center"
                 FontWeight="Bold"
                 Foreground="white" />
    </Border>
    <AdornedElementPlaceholder x:Name="valAdorner"
                               VerticalAlignment="Center">
      <Border BorderBrush="red"
              BorderThickness="1" />
    </AdornedElementPlaceholder>
  </DockPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

当 TextBox 包含无效内容时,上述模板会应用红色边框,并在 TB 右侧立即添加一个包含感叹号的红色框。

问题是,感叹号与 TB 右侧紧邻的任何内容重叠,而不是更改布局以容纳感叹号。我在 DataGrids 中遇到类似的问题 - 感叹号与包含单元格的右侧边缘重叠,而不是增加列宽以容纳它。

使用 Snoop,模板似乎显示在“装饰层”中,我认为它是一个单独的视觉树?这可以解释为什么没有重新计算窗口的布局以考虑感叹号。谁能建议一种方法来实现我想要的?

wpf xaml wpf-controls

4
推荐指数
1
解决办法
2060
查看次数

在.Net客户端中创建多个Signalr集线器代理

我开始使用SignalR(.Net客户端),在我看到的示例中,他们创建了连接,然后创建了集线器代理,然后启动连接,例如: -

var hubConnection = new HubConnection("http://localhost:8080/");

var fooProxy = hubConnection.CreateHubProxy("FooHub");
var barProxy = hubConnection.CreateHubProxy("BarHub");

hubConnection.Start().Wait();

// The proxies can now be used
Run Code Online (Sandbox Code Playgroud)

我的服务器将由几个集线器组成(主要为客户端提供请求 - 响应样式操作),但是客户端应该创建它在启动期间可能需要的所有代理,然后传递给它们以供客户端中的其他类.

是否可以仅在需要时(例如在方法中)创建集线器代理,然后在完成后处理它?(我试过这个,但是一旦连接启动,SignalR就不会让你创建一个集线器代理).或者创建一个集线器代理是"昂贵的",那么为什么所有这些都是"预先"完成的?

如果我坚持以这种方式创建代理,那么将它们暴露给其余客户端代码的好方法是什么?某种单身工厂?

c# signalr signalr.client

4
推荐指数
1
解决办法
6133
查看次数

一个NuGet包(SQLite Core)导致TFS构建失败

我的解决方案配置为"恢复包",但其中一个项目未能构建: -

3> C:\ Builds\1\xxxxx\xxxx.csproj(223,5):错误:此项目引用此计算机上缺少的NuGet包.启用NuGet Package Restore以下载它们.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105.丢失的文件是..\packages\System.Data.SQLite.Core.1.0.97.0\build \net45\System.Data.SQLite.Core.targets.

它可能是一个红鲱鱼,但上面的错误出现在包恢复之前的日志中,即

2> RestorePackages:

恢复NuGet包......

在违规项目的.csproj文件的末尾附近是这一<Target>部分,似乎产生了上述错误: -

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" />

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets'))" />
</Target>
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我是否正确地假设这个检查是在解决方案的包甚至已经恢复之前发生的(因此它失败了)?我该如何解决?

解决方案中的其他项目(那些没有引用SQLite核心包的项目)可以很好地恢复它们的包,并且可以成功构建.

system.data.sqlite tfsbuild nuget sqlite-net nuget-package-restore

4
推荐指数
1
解决办法
1379
查看次数

依赖注入和内部帮助程序类

我使用Castle Windsor,但我猜这适用于所有DI容器......

我经常发现自己创建内部帮助程序类并将其注入其他类.(实际上Windsor不支持内部ctrs所以我通常最终将帮助程序类公开,这是我的第一个"代码味道").

助手类可能有一些已经在温莎注册的类型了自己的依赖,因此它是有道理的(对我来说)注册与温莎助手类也一样,这样我就可以把它注射到需要它的类.例如

public MyService : IService
{
    public MyService(MyHelper helper, other dependencies...)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在阅读了几篇文章之后,我开始怀疑这是否"误用"温莎,或者只是一般糟糕的代码设计.如果是这样的话,我应该如何处理帮助类?

c# dependency-injection castle-windsor

4
推荐指数
2
解决办法
1637
查看次数

了解.Net中的32位与64位

我总是绕过构建64位桌面应用程序的问题,因为我不知何故在我脑海里发现这不是一件容易的事情,而且我想我并不是真的理解解决方案"配置管理器"对话框,平台和配置.

无论如何,我只是尝试通过简单地将所有解决方案项目的平台更改为x64来转换现有应用程序,并且它有效.我唯一的问题是其中一个项目引用的C++ DLL,需要重建为x64.

所以我的问题(最后)是:为什么我只有C++ DLL的问题,但我的解决方案中的项目引用的许多.Net程序集DLL都没问题?

究竟是什么决定了我的应用程序是否构建为64位?我将所有解决方案的项目更改为"x64",但如果将它们保留为"任何CPU",它是否仍然有用,我只将WPF(启动)项目更改为"x64"?

编辑

所以最后我似乎只能将所有项目平台设置为"任何CPU"而不是"x64"(TFS服务器无法使用后者运行单元测试).甚至引用非托管64位DLL的项目也很满意(不确定原因).

诀窍是取消选中Prefer 32-bitWPF(启动)项目属性中的选项.构建的应用程序现在作为64位应用程序运行,并且TFS /单元测试运行愉快.

.net c# 32bit-64bit

4
推荐指数
2
解决办法
1808
查看次数

WPF 桌面应用程序中的 gRPC 服务器?

我目前正在使用 gRPC,到目前为止已经创建了一个简单的 C# hello world 演示,使用 Visual StudioASP.Net Core gRPC Service项目作为服务器和客户端控制台应用程序。

接下来我想做的是让 gRPC 服务器在 .Net 6 WPF 桌面应用程序(称为“AppA”)中运行,从而允许另一个桌面应用程序(“AppB”)向 AppA 发出信息请求。这可能吗?

通常我会使用 WCF 来实现此目的,但由于 CoreWCF 的不成熟,我被警告不要使用它。

.net grpc asp.net-core

4
推荐指数
1
解决办法
1669
查看次数

C#线程安全(特别是MVVM/WPF)

我想知道我需要做些什么来使MVVM中的模型线程安全.假设我有以下类,它被实例化为单例:

public class RunningTotal: INotifyPropertyChange
{
   private int _total;
   public int Total
   {
      get { return _total; }
      set
      {
         _total = value;
         PropertyChanged("Total");
      }
   }
   ...etc...
}
Run Code Online (Sandbox Code Playgroud)

我的视图模型通过属性公开它:

public RunningTotal RunningTotal { get; }
Run Code Online (Sandbox Code Playgroud)

我的观点有一个绑定它的文本块,即{Binding Path=RunningTotal.Total}.

我的应用程序有一个后台线程,定期更新Total的值.假设没有其他任何更新总计,我应该做什么(如果有的话)使所有这些线程安全?

现在,如果我想做类似的事情,但使用类型的属性Dictionary<>,或者ObservableCollection<>?哪些成员(添加,删除,清除,索引器)是线程安全的?我应该使用ConcurrentDictionary吗?

c# wpf mvvm

3
推荐指数
1
解决办法
4550
查看次数

Azure DevOps 构建管道中的 NuGet 包还原

这是我昨天遇到的一个问题的后续:NuGet package restore in builds and Visual Studio

我已经从我的 VS2013 解决方案中删除了“.nuget”解决方案文件夹,但是我的构建管道中的“Visual Studio 构建”任务现在失败了,每个项目都有一个错误:

[错误]xxxxx.csproj(214,5):错误:此项目引用此计算机上缺少的 NuGet 包。启用 NuGet 包还原以下载它们。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105。丢失的文件是 c:\Temp\VSTS Agent_work\10\s\xxxxx\.nuget\NuGet.targets。

我试过检查 VS 构建任务中的“还原 NuGet 包”选项,但没有区别。该复选框表示此选项已弃用,要使用“Nuget 工具安装程序”任务 - 我也尝试过此操作,但仍然没有帮助。

我什至在构建管道中添加了“Nuget (command=restore)”任务。它的输出显示它已将 Nuget 包恢复到解决方案的 \packages 文件夹中,但再次没有任何乐趣。

我检查了 .csproj 文件中的相对包路径,它们正确地指向由上述“Nuget 恢复”任务恢复的包文件夹。

我是否遗漏了什么,或者是将“.nuget”解决方案文件夹放回的唯一修复方法?

tfsbuild nuget-package-restore azure-devops azure-pipelines azure-devops-server-2019

3
推荐指数
1
解决办法
3278
查看次数