我遇到了一个奇怪的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)
有没有办法避免这个编译器生成的额外的间接层与明确实现的接口?
我正在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 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上,而不是一个视图(即便如此,它也应该是不编译未修改的视图)
在"缺陷预防实用指南"中,作者提到,提高软件开发效率的一种创新方法是实施"生产力游戏",员工之间的竞争方式类似于获得Stack Overflow上的声誉和徽章.
他们给出的一个例子是微软"Vista内部Beta 1游戏",其中团队成员被要求执行任务,这将给他们写一封拼写为"beta 1"的信.他们得到这些信件:
他们有一个网站跟踪每周的排行榜.作者描述了结果:
beta 2游戏扩展了概念并为测试活动颁发了积分.有多种级别的奖品和随机图纸,玩家可以根据参与情况获得腕带.在某些情况下,腕带成为会议和走廊的象征,刺激了竞争.
这些游戏最终在公司范围内发布的发布游戏中达到高潮.奖品是基于完成安装和某些测试活动的人的随机图纸.再一次,结果是惊人的,公司的大多数人参与了测试Windows Vista的最后几天.
有没有人在贵公司实施或参与类似的事情?怎么样?什么进展顺利,什么没有成功?
PS请不要对Vista有任何讽刺性的评论,因为它仍然是Windows 7的主要核心,我认为游戏理念有一些优点.
更新:添加赏金以获得更多想法.在赏金周结束后,我会接受最有趣的一个.我正在寻找可以由20多人的开发团队完成的实用想法.
更新2:看起来Facebook有一个" 推动业力 " 的元游戏,以确定谁的提交通常是好的.
我刚丢失了一些代码.我需要将一些方法从一个类移动到另一个类,所以我点击保存,切割方法和VS崩溃.现在似乎保存发生在切割之后,因为代码已经保存而没有这些方法,但代码不在我的剪贴板上.所以我没有代码,没有简单的方法来取回它!
我知道Visual Studio会保留一个文档缓存,它在显示恢复文件对话框时使用,但是当VS启动备份时它没有显示.我希望我的班级版本仍然在那里,所以我不必重新开始,但我不知道在哪里看.
任何人都可以告诉我VS将这些文件保存在磁盘上的位置吗?
非常感谢您提供的任何帮助.
我想运行一个具有" 心跳 " 的任务,该任务以特定的时间间隔继续运行,直到任务完成.
我在想这样的扩展方法效果很好:
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) 我在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) 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#代码中使用了一个非常简单的三元表达式:
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# ×5
.net ×2
appdomain ×1
asp.net-mvc ×1
async-await ×1
chm ×1
domain-name ×1
game-theory ×1
hosts-file ×1
mstest ×1
recovery ×1
unit-testing ×1
validation ×1
windows ×1