小编Adr*_*ian的帖子

将StackTrace附加到异常而不在C#/ .NET中抛出

我有一个使用返回值处理错误的组件,而不是标准的异常处理.除了错误代码之外,它还返回错误发生位置的堆栈跟踪.我用来调用组件的包装器将解释返回代码并抛出异常.

我想让包装器抛出一个异常,其中包含从组件中捕获的堆栈跟踪信息.我希望它看起来好像异常是从错误的原始站点抛出的,即使它被抛到其他地方.更具体地说,id类似于visual studio测试运行器显示的堆栈跟踪,以反映正确的位置

有没有办法做到这一点?如果我可以避免访问私人成员的低级反射技巧,那也很好,但我会采取我能得到的.

编辑1: 我不关心如何捕获堆栈跟踪,我关心的是将已经捕获的堆栈跟踪附加到异常

编辑2:

我尝试重写StackTrace属性,但是visual studio正在从其他地方提取堆栈跟踪数据,并且似乎完全忽略了被覆盖的属性

    CustomException GenerateExcpetion()
    {
        return new CustomException();
    }
    void ThrowException(Exception ex)
    {
        Trace.WriteLine("Displaying Exception");
        Trace.WriteLine(ex.ToString());
        var edi = ExceptionDispatchInfo.Capture(ex);
        edi.Throw();
    }
    [TestMethod]
    public void Test006()
    {
        var ex = GenerateExcpetion();
        ThrowException(ex);
    }
    public class CustomException : Exception
    {
        string _stackTrace;
        public CustomException()
        {
            _stackTrace = Environment.StackTrace;
        }

        public override string StackTrace
        {
            get
            {
                return base.StackTrace;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Excpetion.ToString()方法从私有属性中提取堆栈跟踪数据,因此来自覆盖的堆栈跟踪不会显示.

CustomException:抛出了类型'CustomException'的异常.

ExceptionDispatchInfo也从私有属性中查找堆栈跟踪数据,因此它无法找到任何该数据,并且当您抛出此自定义异常时,新的堆栈跟踪将附加到该异常,其位置为抛出.如果直接使用throw,则私有堆栈信息将设置为发生抛出的位置.

.net c#

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

在成员c#之后,"+"在反映的FullName和'*'中的含义是什么

我目前正在处理c#中的反射.后:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetTypes()
Run Code Online (Sandbox Code Playgroud)

我发现了这个:( [System.Numerics.Matrix4x4], [System.Numerics.Matrix4x4+CanonicalBasis], [System.Numerics.Matrix4x4+VectorBasis] 有来自"System.Numerics.Vectors.dll"的反映类型)我知道Matrix4x4是结构,但我找不到关于CanonicalBasis和VectorBasis的任何信息,以及"+"在这种情况下的含义.我正在做进一步的研究,另一个奇怪的事情是:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").FullName
"System.Numerics.Matrix4x4+VectorBasis"
Run Code Online (Sandbox Code Playgroud)

但:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").Name
"VectorBasis"
Run Code Online (Sandbox Code Playgroud)

此外,当我查看Matrix4x4 + VectorBasis的成员时,有这样的成员:

[System.Numerics.Vector3* Element0] 
Run Code Online (Sandbox Code Playgroud)

它是像c ++中的原始指针吗?或者它是什么?

PS我在c#interactive中这样做,但我认为它对结果没有任何影响.

.net c# reflection

13
推荐指数
1
解决办法
535
查看次数

C#Linq:将多个.Where()与* OR *子句组合

我一直在搜索有关当前问题的大量信息,但找不到解决该问题的真正答案。

我正在尝试生成一个生成以下SQL的LINQ查询:

SELECT * FROM TABLE WHERE (Field1 = X, Field2 = Y ... ) or (Field3 = Z)
Run Code Online (Sandbox Code Playgroud)

在正常情况下,我只会这样做:

Object.Where(c => (c.Field1 == X && c.Field2 == Y) || (c.Field3 == Z))
Run Code Online (Sandbox Code Playgroud)

我不能使用这种方法,因为查询是通过使用多个.Where()调用来构建的。

有一个例子:

// This is a short example, the real world situation has 20 fields to check and they are all connected with an AND.
if (model.Field1.HasValue) 
{
    Query = Query.Where(c => c.Field1 == X)
}

if (model.Field2.HasValue) 
{
    Query = Query.Where(c => c.Field2 == …
Run Code Online (Sandbox Code Playgroud)

.net c# linq where

13
推荐指数
3
解决办法
2481
查看次数

如何检查类型是否适合C#中的非托管约束?

如何检查类型T是否符合unmanaged类型约束,以便可以在以下上下文中使用:class Foo<T> where T : unmanaged?我的第一个想法是typeof(T).IsUnmanaged或类似的东西,但这不是Type班级的属性/领域

c# generics reflection types c#-7.3

10
推荐指数
1
解决办法
420
查看次数

字典初始值设定项具有不同的行为,并在与数组初始值设定项组合使用时引发运行时异常

我有以下C#代码,用int键和List<string>值初始化一个新的字典:

var dictionary =
    new Dictionary<int, List<string>>
    {
        [1] = new List<string> { "str1", "str2", "str3" },
        [2] = new List<string> { "str4", "str5", "str6" }
    };
Run Code Online (Sandbox Code Playgroud)

如果我将从此代码段生成的可执行文件反编译回C#,则相应的部分如下所示:

Dictionary<int, List<string>> expr_06 = new Dictionary<int, List<string>>();
expr_06[1] = new List<string>
{
    "str1",
    "str2",
    "str3"
};
expr_06[2] = new List<string>
{
    "str4",
    "str5",
    "str6"
};
Run Code Online (Sandbox Code Playgroud)

一切似乎正常,并在这里正常工作.

但是当我有以下代码时:

var dictionary2 =
    new Dictionary<int, List<string>>
    {
        [1] = { "str1", "str2", "str3" },
        [2] = { "str4", "str5", "str6" } …
Run Code Online (Sandbox Code Playgroud)

c# dictionary initialization c#-6.0

9
推荐指数
1
解决办法
243
查看次数

Mac OS X Credential Provider等效

Windows下的CredentialProvider API的Mac OS X是否有等效的API?

macos

6
推荐指数
1
解决办法
556
查看次数

检查CTRL + ALT + DEL屏幕是否可见的另一种方法

目前,我正在使用以下代码来测试CTRL+ ALT+ DEL屏幕是否可见以及是否按预期工作。问题是,轮询此信息会消耗CPU,并且我正在寻找基于事件的选项。有谁知道另一种方法来检测此屏幕是否可见?

我只需要知道何时关闭此屏幕。我不在乎它何时打开。只是它已经打开,现在已关闭。

老实说,我找到了这段代码,但我不确定它是如何具体针对我所指的屏幕的。它似乎在寻找任何进程创建和删除事件。这意味着该屏幕必须打开一个新进程。知道该进程名称也将有所帮助。

var interval = new TimeSpan(0, 0, 3);
const string isWin32Process = "TargetInstance isa \"Win32_Process\"";

// Listen for started processes.
WqlEventQuery startQuery = new WqlEventQuery("__InstanceCreationEvent", interval, isWin32Process);
var _startWatcher = new ManagementEventWatcher(startQuery);
_startWatcher.Start();
_startWatcher.EventArrived += OnStartEventArrived;

// Listen for closed processes.
WqlEventQuery stopQuery = new WqlEventQuery("__InstanceDeletionEvent", interval, isWin32Process);
var _stopWatcher = new ManagementEventWatcher(stopQuery);
_stopWatcher.Start();
_stopWatcher.EventArrived += OnStopEventArrived;
Run Code Online (Sandbox Code Playgroud)

该屏幕的名称是什么?以及如何检测这种类型的窗口?似乎与登录窗口的类型相同。

在此处输入图片说明

c# windows winapi windows-10

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

如何使用Directory.EnumerateFiles()应用多个搜索模式?

我使用下面的代码搜索具有特定扩展名的目录(及其子目录)中的文件:

Directory.EnumerateFiles(dir, Path.GetFileNameWithoutExtension(item) + ".ext1" , SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用不同的扩展名文件,如".ext1",".ext2",".ext3".我想在我的搜索模式中结合这些扩展,如下所示:

Directory.EnumerateFiles(dir, Path.GetFileNameWithoutExtension(item) + ".ext1||.ext2" , SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)

建议好吗?

c# linq .net-4.0

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

如何重命名C#名称空间以包含点

我想将我的命名空间重命名MyProjectTest.CoreMyProject.Test.Core,但是Visual Studio 2017重构工具不允许我将其插入.名称中。

我不想手动进行操作,还有其他选择吗?

c# refactoring namespaces visual-studio

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

C# 数组索引器

我想知道:C# 数组索引器是如何实现的?ulong您可以使用从到 的基本上每个整数值来索引 C# 数组sbyte,内部实现是否每次都简单地转换为通用类型?

需要明确的是:

ulong i = 10;
var o = myArray[i];
Run Code Online (Sandbox Code Playgroud)

被翻译成这样的东西:

ulong i =10;
var o = myArray[(int /*or whatver is the default type used*/)i];
Run Code Online (Sandbox Code Playgroud)

c# arrays casting indexer

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