Tag: 提升

是否有一个提升lexical_cast相当于C#TryParse?

简介(来自Eric Lippert博客): 不幸的例外是不幸的设计决定的结果。 在完全非特殊情况下抛出exception情况,因此必须始终抓住并处理。 一个令人烦恼的exception的典型例子是Int32.Parse,如果你给它一个无法解析为整数的字符串,它会抛出。 但是这个方法的99%用例是转换用户输入的字符串,这可能是任何旧的东西,因此解析失败绝不是例外。 更糟糕的是,如果没有自己实现整个方法,调用者就无法提前确定他们的参数是否是坏的,在这种情况下,他们不需要首先调用它。 现在重要的部分: 这个不幸的设计决定非常令人烦恼,当然框架团队很快就会实施TryParse,这样做是正确的。 来自MSDN Int32.TryParse: 返回值类型:System.Boolean如果s已成功转换,则为true;否则为false。 否则,是的。 所以同事们正在研究一些需要检查一个字符串是否为数字的代码,所以在考虑它并意识到没有好的C ++解决方案之后(基本上它是for__each / find_if或boost:lexical_cast try catch)我想拥有is_convertible或者来自boost的东西会有多好? 我可以包装boost lexical_cast并在try块结束时返回true并在catch块结束时返回false但我更喜欢现有的做法:)解决方案。

在C#中举起一个事件

我在微软实践测试中遇到了这个问题,我感到很困惑。 这是一个问题: 假设已声明了Alarm事件,AlarmEventArgs类和AlarmEventHandler委托,以下哪个C#代码示例是引发事件的正确方法? 以下是他们提供的“正确”答案: AlarmEventArgs e = new AlarmEventArgs(1, 2); AlarmEventHandler handler = Alarm; if (handler != null) { handler(this, e); } 但是,还有另一个看似正确的答案。 AlarmEventArgs e = new AlarmEventArgs(1, 2); if (Alarm!= null) { Alarm (this, e); } 我个人总是使用第二种方法。 它工作得很好。 有人可以告诉我为什么我应该使用第一种方法而不是第二种方法?

重启程序无法获得

出于某种原因,我的C#程序需要以提升的权限重新启动。 我使用以下代码来实现它: private static void RestartForPermissionsFix() { ProcessStartInfo processInfo = new ProcessStartInfo(); processInfo.Verb = “runas”; processInfo.FileName = Assembly.GetExecutingAssembly().Location; Process.Start(processInfo); } 这很好用。 在我“修复我的权限”之后,我想重新启动程序。 没有“runas”,我尝试了同样的方法,但它不起作用。 我假设从提升的进程启动的进程自动boost。 任何的想法?

.NET字节上的正则表达式而不是字符

我正在尝试使用正则表达式进行一些更容易的解析。 输入是字节的数组(或枚举)。 我不想将字节转换为字符,原因如下: 计算效率 内存消耗效率 某些不可打印的字节可能很复杂,无法转换为字符。 并非所有字节都是可打印的。 所以我不能使用正则表达式 。 我所知道的唯一解决方案是使用Boost.Regex (它在字节上工作–C字符),但这是一个C ++库,使用C ++ / CLI进行包装将需要相当多的工作。 如何直接在.NET中的字节上使用正则表达式,而无需使用.NET字符串和字符? 谢谢。

如何分解成员访问表达式链?

短版(TL; DR): 假设我有一个表达式,它只是一个成员访问运算符链: Expression<Func> e = x => x.foo.bar.baz; 您可以将此表达式视为子表达式的组合,每个子表达式包含一个成员访问操作: Expression<Func> e1 = (Tx x) => x.foo; Expression<Func> e2 = (Tfoo foo) => foo.bar; Expression<Func> e3 = (Tbar bar) => bar.baz; 我想要做的是将这些组件子表达式分解,以便我可以单独使用它们。 更短的版本: 如果我有表达式x => x.foo.bar ,我已经知道如何中断x => x.foo 。 如何拉出另一个子表达式foo => foo.bar ? 为什么我这样做: 我试图在C#中模拟“提升”成员访问操作符,就像CoffeeScript的存在访问操作符一样?. 。 Eric Lippert表示, 类似的运营商被考虑用于C#,但没有预算来实施它。 如果这样的运算符存在于C#中,您可以执行以下操作: value = target?.foo?.bar?.baz; 如果target.foo.bar.baz链的任何部分结果为null,那么整个事情将评估为null,从而避免NullReferenceException。 […]

如何使用.NET升级COM组件

我发现了一篇关于如何通过调用CoCreateInstanceAsAdmin来提升用C ++编写的COM对象的文章 。 但是我无法找到或做的是将.NET(c#)应用程序的一个组件实现为COM对象,然后调用该对象来执行需要UAC提升的任务。 MSDN将此文档记录为管理COM对象模型 。 我知道以管理员身份启动应用程序(或其他应用程序)是可能的,并且很容易在单独的过程中执行任务(例如参见Daniel Moth的post ,但我正在寻找的是一种方式从同一个未提升的.NET可执行文件中做所有事情。当然,这样做会在新进程中生成COM对象,但是由于透明的编组,.NET COM对象的调用者不应该(也是很多)意识到这一点。 关于如何使用C#项目,通过CoCreateInstanceAsAdmin API实现用C#编写的COM对象的任何想法都会非常有用。 所以我真的很想学习如何在C#中编写COM对象,然后我可以通过COM高程API从C#调用它。 不要紧,boost的COM对象是否在同一进程中运行。 我只是不想让整个应用程序升级; 我只想提升将执行代码的COM对象。 如果我能写出一些东西: // in a dedicated assembly, marked with the following attributes: [assembly: ComVisible (true)] [assembly: Guid (“….”)] public class ElevatedClass { public void X() { /* do something */ } } 然后让我的主应用程序通过CoCreateInstanceAsAdmin调用实例化ElevatedClass 。 但也许我只是在做梦。

如何启动流程升级

我的应用程序运行, highestAvailable设置为highestAvailable 。 如何运行一个没有升级的流程? 我尝试了以下但它不起作用: Process.Start(new ProcessStartInfo {FileName = “foo.exe”, Verb = “open”}) 我尝试了以下信任级别来使用Win32 API启动我的进程,但它们都没有正常工作: 0 1260: This program is blocked by group policy. For more information, contact your system administrator. 0x1000 The application was unable to start correctly (0xc0000142). Click OK to close the application. 0x10000 Process starts then hangs 0x20000 All options are […]