我目前正在为可以在控制台中运行的服务编写一些引导代码.它本质上归结为调用OnStart()方法而不是使用ServiceBase来启动和停止服务(因为如果它没有作为服务安装并且使调试成为一场噩梦,它就不会运行应用程序).
现在我使用Debugger.IsAttached来确定我是否应该使用ServiceBase.Run或[service] .OnStart,但我知道这不是最好的主意,因为有些时候最终用户想要在控制台中运行服务(看看输出等实时).
关于如何确定Windows服务控制器是否启动"我",或者用户是否在控制台中启动"我"的任何想法?Apparantly Environment.IsUserInteractive不是答案.我想过使用命令行args,但这看起来很"脏".
我总是可以看到围绕ServiceBase.Run的try-catch语句,但这看起来很脏.编辑:尝试捕获不起作用.
我有一个解决方案:把它放在这里给所有其他感兴趣的堆叠器:
    public void Run()
    {
        if (Debugger.IsAttached || Environment.GetCommandLineArgs().Contains<string>("-console"))
        {
            RunAllServices();
        }
        else
        {
            try
            {
                string temp = Console.Title;
                ServiceBase.Run((ServiceBase[])ComponentsToRun);
            }
            catch
            {
                RunAllServices();
            }
        }
    } // void Run
    private void RunAllServices()
    {
        foreach (ConsoleService component in ComponentsToRun)
        {
            component.Start();
        }
        WaitForCTRLC();
        foreach (ConsoleService component in ComponentsToRun)
        {
            component.Stop();
        }
    }
编辑:在StackOverflow上有另一个问题,那个人有环境问题.CurrentDirectory是"C:\ Windows\System32"看起来可能是答案.我今天要考试.
有没有办法在不对XmlDocument/temp字符串进行往返的情况下对对象进行de /序列化?我正在寻找以下内容:
class Program
{
    static void Main(string[] args)
    {
        XDocument doc = new XDocument();
        MyClass c = new MyClass();
        c.SomeValue = "bar";
        doc.Add(c);
        Console.Write(doc.ToString());
        Console.ReadLine();
    }
}
[XmlRoot(ElementName="test")]
public class MyClass
{
    [XmlElement(ElementName = "someValue")]
    public string SomeValue { get; set; }
}
我这样做时会出现错误(非空白字符无法添加到内容中.)如果我将该类包装在元素中,我看到写的内容是<element> ConsoleApplication17.MyClass </ element> - 所以错误说得通.
我这样做有扩展方法DE /自动序列化,但是这不是我所期待的(这是客户端,但我还是想更多的东西最佳).
有任何想法吗?
我将为我公司的开发人员提供设计模式的速成课程(最近遇到一些可怕的代码之后).
我想要提出的最重要的事情之一就是它们可以在长期和短期内节省时间(他们确实这样做了!) - 因为这里的开发人员受到相当长的时间压力.总而言之,我需要展示每天的好处 - 让他们早点回家的事情.
告诉他们这可能意味着更少的错误可能不会回家.我需要的东西会沉入其中.
我可能会做三到四节,每节一小时.你们有什么建议可以触摸/做什么?
我遇到的情况我认为只能通过使用ref参数来解决.但是,这意味着当我只需要5%的ref参数提供的功能时,将方法更改为始终接受ref参数.
这让我觉得"哇,疯了,必须找到另一种方式".我是傻瓜吗?ref参数可能导致哪些问题?
编辑
要求提供进一步的细节,我不认为它们与我的要求完全相关,但我们走了.
我想要保存一个新实例(将使用以后可能使用的ID进行更新)或检索与某些逻辑匹配的现有实例并更新它,保存它然后更改新实例的引用以指向现有的.
代码可能会更清晰:
protected override void BeforeSave(Log entity)
{
    var newLog = entity;
    var existingLog = (from log in repository.All()
                           where log.Stuff == newLog.Stuff 
                                 && log.Id != newLog.Id
                           select log).SingleOrDefault();
    if (existingLog != null)
    {
        // update the time
        existingLog.SomeValue = entity.SomeValue;
        // remove the reference to the new entity
        entity = existingLog;
    }
}
// called from base class which usually does nothing before save
public void Save(TEntity entity)
{
    var report = validator.Validate(entity);
    if (report.ValidationPassed) …我正在尝试为XPath创建一个'AET'(抽象表达式树)(因为我正在编写一个WYSIWYG XSL编辑器).在过去的三到四个小时里,我一直用XPath BNF撞墙.
我想到了另一个解决方案.我想我可以编写一个实现IXPathNavigable的类,它在调用CreateNavigator时返回我自己的XPathNavigator.这个XPathNavigator总是会在任何方法调用上成功,并会跟踪这些调用 - 例如我们移动到客户节点,然后移动到客户节点.然后我可以使用这些信息(希望)来创建'AET'(因此我们现在可以在对象模型中拥有客户/客户).
唯一的问题是:如何在地球上我通过XPathExpression运行IXPathNavigable?
我知道这太懒了.但是有没有其他人经历过努力并编写了一个XPath表达式解析器?我还没有POC我可能的解决方案,因为我无法测试它(因为我无法对IXPathNavigable运行XPathExpression),所以我甚至不知道我的解决方案是否能够正常工作.
我希望将标准 .Net ConfigurationManager类重定向到另一个文件; 完全.路径是在运行时确定的,所以我不能使用configSource等(这不是一个重复的问题 - 我已经查看了其他的).
我本质上是想重复ASP.Net在幕后做的事情.因此,不仅我的类应该从新的配置文件中读取,而且还应该读取任何标准的.Net内容(我特意尝试使用的是system.codeDom元素).
我已经破解了开放的Reflector,并开始研究ASP.Net是如何做到的 - 它非常多毛且完全没有记录.我希望其他人对这个过程进行反向设计.不一定要寻找完整的解决方案(会很好),而只需要文档.
刚刚看到这个网站。功能 9 是内存管理,他们声称他们的产品“自动释放不再需要的内存”。
这是一种营销策略,还是你认为他们有什么伎俩?他们只是根据 .Net 运行时在任何情况下提供的内容做出声明(还是他们喘不过气来?调用 GC.Collect())?
对产品并不是很感兴趣,DotFuscator 对我来说就足够了 - 我只是对如何实现这一点非常感兴趣。
我已经决定不可能通过反射执行以下(等效的)枚举操作 - 因为Enum类没有运算符,并且发出的代码也没有公开任何运算符:
object boxedEnum = MyEnum.Flag1 | MyEnum.Flag2;
boxedEnum &= ~MyEnum.Flag2; // Remove the flag.
所以我目前正在做以下(相当于):
int boxedEnumValue = (int) boxedEnum;
boxedEnumValue &= ~MyEnum.Flag2;
boxedEnum = Enum.ToObject(boxedEnum.GetType(), boxedEnumValue);
哪个工作正常,唯一的问题是将boxedEnum转换为整数的等效代码是:
int boxedEnumValue = int.Parse(Enum.Format(boxedEnum.GetType(), boxedEnum, "X"), System.Globalization.NumberStyles.HexNumber);
我相信你会同意这是可怕的和hacky.
所以这个问题有两个方面.如果有人可以证明我错了并提供在盒装枚举上执行二进制操作的方法,那将是非常棒的 - 否则任何避免字符串往返的方法都将受到赞赏.
为了将枚举转换为特定类型,Guffa给了我所需要的东西.我编写了一个扩展方法来执行细节:
    /// <summary>
    /// Gets the integral value of an enum.
    /// </summary>
    /// <param name="value">The enum to get the integral value of.</param>
    /// <returns></returns>
    public static T ToIntegral<T>(this object value)
    {
        if(object.ReferenceEquals(value, null))
            throw new ArgumentNullException("value"); …是否有人详尽列出了C#/ CLR提供给操作员的名称?(也许我缺乏睡眠开始了,但是我似乎无法在Google上找到它)例如op_Addition,op_Subtraction。此外,这些机会是否有可能在其他文化中有所不同?
我正在尝试创建一个可以添加/减去两个对象的类,并且我已经完成了所有原语-我只需要做“其余”。
非常感谢。
事件要慢多少?我编写了一个流式XML解析器(可以处理开放式和不完整的文档),通过撕掉事件和使用接口,我获得了显着的速度提升.
还有其他人有战争故事吗?
(我们不要在这里打开GC的虫子,我们都知道它已经坏了:))
有没有人对如何在当前机器上读取MSDTC配置有任何想法?我特意试图检查用户是否已执行以下步骤:
打开组件管理(开始>所有程序>管理工具>组件服务)
双击"组件服务",然后展开"计算机".右键单击"我的电脑",然后选择"属性"
在MSDTC选项卡上,单击"安全配置"按钮,然后按如下方式配置属性:
网络DTC访问:已检查
允许远程客户端:已选中
允许入站:已选中
允许出站:已检查
需要传入呼叫者身份验证:已选中
它是我需要编写的一个小组件的一部分,用于验证最终用户配置.如果错误的话,我认为我不会尝试修复它:只需将用户指向帮助文件 - 因此只需要只读.
c# ×9
.net ×3
enums ×1
events ×1
internals ×1
linq ×1
msdtc ×1
obfuscation ×1
oop ×1
operators ×1
performance ×1
reflection ×1
xml ×1
xpath ×1