小编And*_*ren的帖子

如何完全避免本地化的.NET异常消息

当我的.NET应用程序发生错误时,我收到一条异常消息(在我的例子中)瑞典语.这对大多数用途来说都是无用的,因为.

  • 该消息通常只是原始(英语)异常消息的翻译版本[1]

  • 异常消息很少用于诊断问题,通常包括搜索错误消息.这意味着猜测或使用Web服务来查找原始英语消息.

[1]我不是在开玩笑.示例:在绑定失败的上下文中"调用程序集"被完全混淆.它被翻译成"之称集结号",因为英语是如何使用相同的字是一个呼唤作为一个它被调用.几乎就像有人用字典一字一句地翻译它.

所以我想:我希望能够得到英文异常消息,始终如一,在非英文Windows安装(我希望改变应用程序的线程文化).

有一个类似的问题(英语中的异常消息?),但这是在记录的概念.在那个级别,我可以改变线程文化.

但我希望更改是全局的,并且还包括"不是我的代码"例外.

有没有办法可以配置或"黑客"(例如通过替换资源文件)?我是唯一一个认为翻译异常消息的人,在.NET中是一个可怕的设计缺陷吗?

对不起,如果这是部分咆哮和部分问题.

.net

38
推荐指数
1
解决办法
4778
查看次数

如何为burn Bundle设置UpgradeCode

如果我从常规msi安装程序切换到WiX刻录软件包安装程序,我应该如何选择我的UpgradeCode,以便实现从msi到bundle的升级路径?

例:

版本1.0作为普通的msi安装程序发布,其中UpgradeCode = X.

版本2.0将作为Burn捆绑包发布,包括产品和先决条件,如.NET.如果我希望v2捆绑包能够升级v1 msi,我应该使用以下哪个备选方案

A)msi里面应该保持UpgradeCode = X,并且bundle应该使用与它包装的msi相同的UpgradeCode.v2安装程序可以升级v1安装.

B)msi里面应该保持UpgradeCode = X,并且bundle应该得到一个新的UpgradeCode = Y.

C)msi里面应该得到一个新的UpgradeCode = Y并且bundle应该接管UpgradeCode = X,所以bundle v2可以升级msi v1.

wix burn

18
推荐指数
1
解决办法
3563
查看次数

无法使用VS Debugger Interop执行语句

我正在编写一个调试器扩展VSPackage,我想在遇到断点时在调试过程中执行一个语句.在我的扩展代码中,我有这个:

void Initialize()
{
    // ...standard vspackage init code omitted...

    Globals.Init((DTE2)GetService(typeof(DTE)));              
    Globals.DebuggerEvents.OnEnterBreakMode += (dbgEventReason reason, ref dbgExecutionAction action) =>
    {
        try
        {
           var e1 = Globals.Application.Debugger.GetExpression("1+2");
           Debug.WriteLine(e1.Value);     // Prints "3"

           Globals.Application.Debugger.ExecuteStatement("x = 1+2", 1000);
           Debug.WriteLine("OK");         // Never prints this                          
        } 
        catch (Exception ex)
        {
           Debug.WriteLine("Error: "+ex); // Nor this
        }
    }             
}
Run Code Online (Sandbox Code Playgroud)

在VS实例中调试此扩展时,我加载了一个看起来像这样的简单程序

static void Main()
{
   int x = 5;
   Console.WriteLine("X is "+x); // Breakpoint on this line
}
Run Code Online (Sandbox Code Playgroud)

当在调试过程中遇到断点时,将调用该处理程序并且扩展的输出窗口显示为"3",因此计算表达式可以工作,但它永远不会成功执行该语句.输出窗口中不会再打印任何内容.没有异常或超时发生,我无法继续调试过程,调试器似乎已崩溃.

globals类只保存DTE和DebuggerEvents

public static class Globals
{
   public …
Run Code Online (Sandbox Code Playgroud)

c# debugging envdte visual-studio-extensions visual-studio-2013

15
推荐指数
1
解决办法
429
查看次数

扩展方法存在但未调用时代码执行的差异

TL; DR,问题:

对于代码执行有什么影响可以在.NET中存在扩展方法(例如JIT /优化)?

背景

我在MSTest中遇到测试失败,这取决于是否还测试了看似无关的组件.

我注意到测试失败并且偶然发现只有在加载了另一个测试组件时才会发生故障.在Unittests和Integration测试程序集上运行mstest将开始执行集成测试,并在4.5 CLR下的第21次集成测试中失败,而这在4.0 CLR下不会发生(否则相同的配置).我从集成测试程序集中删除了所有测试但失败的测试.执行现在看起来像是这样,加载了两个测试程序集,mstest加载两个程序集然后在集成测试程序集中执行单个测试,这会失败.

> mstest.exe /testcontainer:Unittests.dll /testcontainer:IntegrationTests.dll

Loading C:\Proj\Tests\bin\x86\Release\Unittests.dll...
Loading C:\Proj\Tests\bin\x86\Release\Integrationtests.dll...
Starting execution...

Results               Top Level Tests
-------               ---------------
Failed                Proj.IntegrationTest.IntegrationTest21
Run Code Online (Sandbox Code Playgroud)

如果没有执行中的Unittests程序集,则测试通过.

> mstest.exe /testcontainer:IntegrationTests.dll

Loading C:\Proj\Tests\bin\x86\Release\Integrationtests.dll...
Starting execution...

Results               Top Level Tests
-------               ---------------
Passed                Proj.IntegrationTest.IntegrationTest21
Run Code Online (Sandbox Code Playgroud)

我认为它必须是[AssemblyInitialize]在UnitTests dll上执行的事情,或者可能是Unittest.dll中的某种静态状态或者在加载测试程序集时修改的公共依赖项.我在Unittests.dll中找不到任何静态构造函数和程序集init.我怀疑包含Unittests程序集时的部署差异(依赖程序集部署在不同的版本等),但我比较了通过/失败的部署目录,它们是二进制等效的.

那么Unittests组件的哪一部分导致测试差异?从单元测试中我一次删除了一半的测试,直到我将它钻到Unit测试程序集中的源文件中.与测试类一起,声明了一个扩展方法:

除了这个扩展类之外,Unittest程序集现在在一个虚拟测试类中包含一个测试用例.仅当我有一个虚拟测试方法声明了扩展方法时,才会发生测试失败.我可以删除所有剩余的测试逻辑,直到Unittest dll是单个文件,包含:

// DummyTest.cs in Unittests.dll
[TestClass]
public class DummyTest
{
    [TestMethod]
    public void TestNothing()
    {
    }
}

public static class IEnumerableExtension
{
   public static IEnumerable<T> SymmetricDifference<T>(
       this IEnumerable<T> @this, …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods jit mstest

12
推荐指数
1
解决办法
395
查看次数

Process.Start()明显慢于在控制台中执行

我在执行.exe时出现性能问题Process.Start().从.NET到控制台,执行大约需要5倍的时间.是什么导致这个?这是一个测试程序:

  public static void Main(string[] argv)
  {       
     for (int i = 0; i < 10; i++)
     {
        ProcessStartInfo psi = new ProcessStartInfo(ExePath, Args);
        Process ps = new Process {StartInfo = psi};
        Stopwatch sw = Stopwatch.StartNew();
        ps.Start();
        ps.WaitForExit();
        sw.Stop();
        Console.WriteLine(i+" Elapsed time: " + sw.ElapsedMilliseconds + "ms.");
        Thread.Sleep(1000);
     }
  }
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

 0 Elapsed time 4310ms.
 1 Elapsed time 4330ms.
 2 Elapsed time 4280ms.
 ...
Run Code Online (Sandbox Code Playgroud)

在cmd窗口中运行它几乎立即返回(低于1秒执行).尝试在控制台中使用时间计时

> powershell Measure-Command { cmd /c start /wait %EXE% %ARGS% } 
Run Code Online (Sandbox Code Playgroud)

其中显示执行大约750毫秒,这是一个很好的5-6倍.不确定我做得对,但750毫秒感觉可能是执行时间.

起初我正在阅读标准,并认为它与此相关,例如,过程需要更长的时间才能完成,而不是CMD …

.net c#

11
推荐指数
1
解决办法
4242
查看次数

Antlr4 C#目标和生成文件的输出路径

我有一个带有Antlr3语法文件的C#解决方案,我正在尝试升级到Anltr4.事实证明,语法很容易(它变得更好,大小只有三分之一!).生成解析器结果是棘手的部分.

在旧的解决方案中,我只是运行AntlrWorks来更新语法文件更改时的词法分析器和解析器.cs文件.词法分析器和解析器直接包含在与语法相同的项目中,因此解析器周围的框架可以直接使用它们.

使用C#的Antlr4目标,我注意到(至少在默认情况下)生成的Parser C#类的输出路径位于中间目录中,例如obj\Debug.这意味着我无法在同一个项目中直接使用解析器.如果我希望生成的源可以在我的sln中使用,我是否应该更改输出路径?我不想要它在我的sln?

我尝试为解析器生成创建一个单独的项目,即包含语法文件的项目.当使用Antlr4目标构建此项目时,可以从需要解析器类的项目中引用生成的程序集.但是,如果这个项目包含在解决方案中,我仍然没有在visual studio中获得任何intellisense,因为它将intellisense基于加载项目的源文件,所以它仍然不太可用.我能使其正常工作的唯一方法是构建然后卸载解析器项目,并让其他项目将其作为程序集文件而不是项目引用.

编辑:

在查看antlr-interest列表后,我发现这个线程表明intellisense的问题可能是Resharpers故障.如果是这种情况,那么我的问题是如何在我的解决方案中继续使用Antlr4和Resharper? https://groups.google.com/forum/#!topic/antlr-discussion/QSuJXphaBDg

c# msbuild antlr4

10
推荐指数
3
解决办法
2678
查看次数

Azure Devops Build:计划构建的参数

有什么方法可以在按计划触发时将参数传递给 azure devops 构建管道 (YAML)?例如,如果您想每晚构建一个发布构建,但又想每周构建一个调试构建?

必须将整个构建管道复制到 SomeBuild-Debug 才能创建默认为 configuration=debug 的构建,以便能够安排它,这似乎是不对的?

azure-devops azure-pipelines

9
推荐指数
2
解决办法
5689
查看次数

如何减少在GC中花费的时间

我正在创建一个桌面应用程序,它具有可能运行几秒钟的计算量大的操作.显然,需要最小化该操作的时间.该操作相当容易并行(单个子任务),每个子任务在单个线程上大约需要50ms.在多个线程上,每个子任务需要4-5倍的时间,因为在GC中花费了40-50%的时间,从而有效地完全取消了加速.

所以我需要减少GC的工作量.我的第一个想法是试图找到哪种类型的对象被垃圾收集最多,但我意识到虽然我经常进行内存分析,但我从未搜索过这样的模式.通常查看堆快照或堆快照之间的差异,但这些显示活动的对象,而不是在这些快照之间创建和处置的对象.所以这是我的第一个问题:什么是最简单的方法来查找创建哪些类型和垃圾收集最多?我试图寻找方法调用计数来查看是否经常怀疑某些构造函数,但是以百万计数创建的所有对象都只是小结构类型.如果我理解正确的话,这些应该对GC没有影响,即使是盒装?

该算法创建了数十万个单独的结果点对象.这些当然不应该是gc'd,因为它们代表了操作的输出.但它引出了我的第二个问题:在GC中花费的时间主要取决于对象的总数,还是主要取决于实际收集的对象数量?我应该尝试限制结果对象的数量,而是使用更少但更大的结果对象吗?

编辑:我通过使用VS 2010并发可视化工具找到了在GC中花费的时间.此外,在并行代码段中,阻塞线程的大多数部分都在等待gc

编辑:我应该澄清性能问题是因为执行在工作站GC上有效序列化.例如,请参阅本文中描述的性能问题.

http://blogs.msdn.com/b/hshafi/archive/2010/06/17/case-study-parallelism-and-memory-usage-vs2010-tools-to-the-rescue.aspx

我无法阻止垃圾收集器阻塞我的线程(我不认为我想要桌面应用程序的服务器GC,对吗?).因此,为了获得此操作的线性加速,我需要减少调用GC的次数.浪费的大部分时间实际上被其他线程阻塞,等待一个线程执行GC.

.net performance garbage-collection

8
推荐指数
1
解决办法
1395
查看次数

如何识别字符串是否包含特定字符的多个实例?

我想检查字符串中是否包含多个字符?如果我有一个字符串12121.23.2所以我想检查它是否包含多个.在字符串中.

c#

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

MSTest推出了适用于.NET v4.5.2测试程序集的QTAgent v4.0版本

如果我使用目标框架v4.5构建一个测试程序集并在其上运行MSTest,它将启动一个QTAgent32.exe实例.但是,如果我将目标框架设置为v4.5.2并运行MSTest,它将改为启动QTAgent32_40.exe的实例.

为什么是这样?如何让MSTest.exe选择正确的QTAgent(在这种情况下为QTAgent32.exe)?是什么决定了QTAgent的起点?

编辑:使用VS2013和VS2015版本的MSTest/QTAgent都会发生这种情况.

.net mstest

8
推荐指数
0
解决办法
476
查看次数