小编Jef*_*ser的帖子

为什么C#编译器插入显式接口实现?

我遇到了一个奇怪的C#边缘案例,我正在寻找一个好的解决方案.

有一个我无法控制的类看起来像这样:

namespace OtherCompany
{
    public class ClassIDoNotControl
    {
        public void SomeMethod(string argument)
        {
            Console.WriteLine((new StackFrame(1).GetMethod().Name));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想从这个类中的一类我继承控制.另外,我想在其上指定一个接口:

interface IInterfaceIDoControl
{
    void SomeMethod(string argument);
}

class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
}
Run Code Online (Sandbox Code Playgroud)

如果所有这些文件都在同一个程序集中,那么一切都很好:

namespace MyCompany
{
    class Program
    {
        static void Main(string[] args)
        {
            IInterfaceIDoControl i = new ClassIDoControl();
            i.SomeMethod("Hello World!"); // Prints "Main"
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果我将"ClassIDoNotControl"移动到另一个程序集中,我就达不到我的预期.相反,我看到输出暗示额外堆栈帧的"MyCompany.IInterfaceIDoControl.SomeMethod".

原因是在C#编译器下,将"ClassIDoControl"更改为如下所示:

class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
    void IInterfaceIDoControl.SomeMethod(string argument)
    {
        base.SomeMethod(argument);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这个编译器生成的额外的间接层与明确实现的接口?

c# compiler-construction

31
推荐指数
1
解决办法
1231
查看次数

在ASP.NET MVC 3 Beta中专门使用Windows身份验证的问题

我正在ASP.NET MVC 3 Beta中创建一个Intranet站点,并且只想使用Windows身份验证.另外,我想在VS2010中使用Visual Studio开发服务器.

我修改了默认的web.config文件以删除对表单身份验证的所有引用并切换到:

<authentication mode="Windows"  />
<authorization>
  <deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

但是,当我启动我的网站并获得默认页面时,我得到了这样的答复:

HTTP/1.1 302 Found
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 02 Nov 2010 14:05:19 GMT
X-AspNet-Version: 4.0.30319
Location: /Account/Login?ReturnUrl=%2f
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 145
Connection: Close
Run Code Online (Sandbox Code Playgroud)

这会在我的浏览器中显示此消息:

'/'应用程序中的服务器错误.

无法找到该资源.

说明:HTTP 404.您要查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用.请查看以下网址,确保拼写正确.

请求的URL:/帐户/登录

版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.0.30319.1版本:4.0.30319.1

如果我在"使用Visual Studio开发服务器"下的项目属性中选择"NTLM身份验证",那么我在connect上正确获得此回复:

HTTP/1.1 401 Unauthorized Server
ASP.NET Development Server/10.0.0.0
Date: Tue, 02 Nov 2010 14:07:37 GMT
Content-Length: 1211 
WWW-Authenticate: NTLM
Run Code Online (Sandbox Code Playgroud)

但是当我进行身份验证时,我得到了302

我认为这只是清除一些默认值但不确定("/ Account/Login"不会出现在我的web.config文件中的任何地方).如果我删除"拒绝"部分,那么事情就可以正常工作,除非我没有得到经过身份验证的校长并且有效地保持匿名.

我相信这曾经在ASP.NET MVC 2和VS2008中工作,只需将身份验证模式更改为Windows,但它似乎不再以这种方式工作.

我知道我可能遗漏了一些基本的东西.谢谢!

注意 …

visual-studio-2010 asp.net-mvc-3

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

Visual Studio 2013持有App_global.asax.PDB文件?

自从升级到Visual Studio 2013(2012年)以来,我注意到在调试我的ASP.NET MVC 5应用程序时,我偶尔会通过IIS Express获得编译器错误转储:

描述:编译服务此请求所需的资源时发生错误.请查看以下特定错误详细信息并相应地修改源代码.

编译器错误消息:CS0042:创建调试信息文件'c:\ Users\Jeff\AppData\Local\Temp\Temporary ASP.NET Files\root\368a9040\83fb9039\App_global.asax.PDB' - 'c:\时出现意外错误Users\Jeff\AppData\Local\Temp\Temporary ASP.NET Files\root\368a9040\83fb9039\App_global.asax.pdb:进程无法访问该文件,因为它正由另一个进程使用.

来源错误:

[没有相关的源代码行]

源文件:行:0

如果我打开Process Explorer然后搜索App_global.asax.pdb(DevEnv.exe具有)的句柄并强制关闭它然后刷新页面,则此错误消失.然而,这很不方便,我从来没有在2013年之前做过这件事.

任何人都知道为什么这种情况会在2013年间歇性发生而不是之前发生?

我能想到的唯一可能的事情是我使用的Razor Generator的MSBuild步骤中的一些模糊问题,但我无法弄清楚为什么它会出现在App_Global.asax上,而不是一个视图(即便如此,它也应该是不编译未修改的视图)

asp.net-mvc razorgenerator visual-studio-2013

25
推荐指数
1
解决办法
4620
查看次数

有没有人试图在工作中实施或参与"生产力游戏"?

"缺陷预防实用指南"中,作者提到,提高软件开发效率的一种创新方法是实施"生产力游戏",员工之间的竞争方式类似于获得Stack Overflow上的声誉和徽章.

他们给出的一个例子是微软"Vista内部Beta 1游戏",其中团队成员被要求执行任务,这将给他们写一封拼写为"beta 1"的信.他们得到这些信件:

  • b:安装beta 1版本
  • e:投票购买beta 1版本
  • t:过夜
  • a:安装3个连续的beta 1版本
  • 1:过夜3次

他们有一个网站跟踪每周的排行榜.作者描述了结果:

beta 2游戏扩展了概念并为测试活动颁发了积分.有多种级别的奖品和随机图纸,玩家可以根据参与情况获得腕带.在某些情况下,腕带成为会议和走廊的象征,刺激了竞争.

这些游戏最终在公司范围内发布的发布游戏中达到高潮.奖品是基于完成安装和某些测试活动的人的随机图纸.再一次,结果是惊人的,公司的大多数人参与了测试Windows Vista的最后几天.

有没有人在贵公司实施或参与类似的事情?怎么样?什么进展顺利,什么没有成功?

PS请不要对Vista有任何讽刺性的评论,因为它仍然是Windows 7的主要核心,我认为游戏理念有一些优点.

更新:添加赏金以获得更多想法.在赏金周结束后,我会接受最有趣的一个.我正在寻找可以由20多人的开发团队完成的实用想法.

更新2:看起来Facebook有一个" 推动业力 " 的元游戏,以确定谁的提交通常是好的.

game-theory

19
推荐指数
1
解决办法
815
查看次数

从Visual Studio文档缓存中恢复文件?

我刚丢失了一些代码.我需要将一些方法从一个类移动到另一个类,所以我点击保存,切割方法和VS崩溃.现在似乎保存发生在切割之后,因为代码已经保存而没有这些方法,但代码不在我的剪贴板上.所以我没有代码,没有简单的方法来取回它!

我知道Visual Studio会保留一个文档缓存,它在显示恢复文件对话框时使用,但是当VS启动备份时它没有显示.我希望我的班级版本仍然在那里,所以我不必重新开始,但我不知道在哪里看.

任何人都可以告诉我VS将这些文件保存在磁盘上的位置吗?

非常感谢您提供的任何帮助.

recovery file-recovery visual-studio

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

使用心跳创建任务

我想运行一个具有" 心跳 " 的任务,该任务以特定的时间间隔继续运行,直到任务完成.

我在想这样的扩展方法效果很好:

public static async Task WithHeartbeat(this Task primaryTask, TimeSpan heartbeatInterval, Action<CancellationToken> heartbeatAction, CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)

例如:

public class Program {
    public static void Main() {
        var cancelTokenSource = new CancellationTokenSource();
        var cancelToken = cancelTokenSource.Token;
        var longRunningTask = Task.Factory.StartNew(SomeLongRunningTask, cancelToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
        var withHeartbeatTask = longRunningTask.WithHeartbeat(TimeSpan.FromSeconds(1), PerformHeartbeat, cancelToken);
        withHeartbeatTask.Wait();
        Console.WriteLine("Long running task completed!");
        Console.ReadLine()
    }

    private static void SomeLongRunningTask() {
        Console.WriteLine("Starting long task");
        Thread.Sleep(TimeSpan.FromSeconds(9.5));
    }
    private static int _heartbeatCount = 0;
    private static void PerformHeartbeat(CancellationToken cancellationToken) …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library async-await azureservicebus

14
推荐指数
1
解决办法
9794
查看次数

如何在运行之前强制MSTEST TestMethod重置所有单例/静态?

我在Visual Studio 2008中使用MSTEST.如何在某个测试类中使用每个单元测试方法,就好像它是第一个运行的测试,以便在运行每个测试之前重置所有全局状态?我不想使用TestInitialize,ClassInitialize,AssemblyInitialize等明确清理世界.例如:

[TestClass]
public class MyClassTests
{
    [TestMethod]
    public void Test1()
    {
       // The "Instance" property creates a new instance of "SomeSingleton"
       // if it hasn't been created before.
       var i1 = SomeSingleton.Instance;
       ...
    }
    [TestMethod]
    public void Test2()
    {
       // When I select "Test1" and "Test2" to run, I'd like Test2
       // to have a new AppDomain feel so that the static variable inside
       // of "SomeSingleton" is reset (it was previously set in Test1) on
       // the …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing mstest appdomain visual-studio-2008

13
推荐指数
2
解决办法
5430
查看次数

确定域名在"主机"文件中是否有效的最佳方法是什么?

Windows Hosts文件允许您将IP与主机名相关联,该主机名具有比普通Internet域名更大的自由度.我想创建一个函数来确定给定的名称是否是有效的"主机"文件域名.

根据这个有效和无效的答案和实验,我想出了这个功能:

private static bool IsValidDomainName(string domain)
{
    if (String.IsNullOrEmpty(domain) || domain.Length > 255)
    {
        return false;
    }

    Uri uri;

    if (!Uri.TryCreate("http://" + domain, UriKind.Absolute, out uri))
    {
        return false;
    }

    if (!String.Equals(uri.Host, domain, StringComparison.OrdinalIgnoreCase) || !uri.IsWellFormedOriginalString())
    {
        return false;
    }

    foreach (string part in uri.Host.Split('.'))
    {
        if (part.Length > 63)
        {
            return false;
        }
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

它还有一个好处,它应该使用Unicode名称(基本正则表达式失败).

有没有更好/更优雅的方式来做到这一点?

更新:正如Bill所建议的那样,Uri.CheckHostName方法几乎可以满足我的需求,但它不允许Windows允许在"hosts"文件中使用"-test"等主机名.我会特别注意" - …

c# validation domain-name hosts-file

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

x64平台上调试器中奇怪的三元运算符行为

我在我的C#代码中使用了一个非常简单的三元表达式:

helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,表达式的每个路径上的函数都返回一个非null对象,但是如果我在调试器中查看结果,它将为null,直到我在代码中引用它,例如使用assert:

Debug.Assert(helperClass.SomeData != null);
Run Code Online (Sandbox Code Playgroud)

如果我在调试模式下使用"x64"或"任何CPU"平台设置,这似乎只会发生.它在"x86"模式下很好用.

在假设我在编译器或调试器中发现了一个错误之前,我试着非常谨慎,但我找不到任何其他解释这种行为.

这是一个完整的类来做一个repro,只需在x64模式的调试器中调用SomeClass.SomeAction()并逐步查看它:

public class SomeClass {
    public bool HasData;
    public object SomeData;

    private SomeClass() {
        HasData = false;
    }

    public static void SomeAction() {
        var helperClass = new SomeClass();
        // Exhibits weird debugger behavior of having helperClass.SomeData = null after this line:
        helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();

        // Note that trying helperClass.SomeData.ToString() returns a debugger error saying SomeData is null

        // But this code is …
Run Code Online (Sandbox Code Playgroud)

c# ternary-operator visual-studio-2010

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

如何使用c#在Windows窗体中创建F1帮助

如何使用c#在Windows窗体中创建键盘快捷键(F1).WinChm

.net windows chm

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