编辑:我已将结果写成博客文章.
C#编译器有点神奇地处理COM类型.例如,这个陈述看起来很正常......
Word.Application app = new Word.Application();
Run Code Online (Sandbox Code Playgroud)
......直到你意识到这Application是一个界面.在接口上调用构造函数?Yoiks!这实际上被转换为对Type.GetTypeFromCLSID()另一个的调用Activator.CreateInstance.
此外,在C#4中,您可以对ref参数使用非ref 参数,并且编译器只是添加一个局部变量以通过引用传递,丢弃结果:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
Run Code Online (Sandbox Code Playgroud)
(是的,有一堆参数丢失.不是可选参数好吗?:)
我正在尝试调查编译器的行为,我没有假装第一部分.我可以做第二部分没有问题:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
Run Code Online (Sandbox Code Playgroud)
我想能够写:
Dummy dummy = new Dummy();
Run Code Online (Sandbox Code Playgroud)
虽然.显然它会在执行时爆炸,但没关系.我只是在试验.
编译器为链接的COM PIA(CompilerGenerated和TypeIdentifier)添加的其他属性似乎没有做到这一点......什么是神奇的酱油?
有没有办法在VS2008中进行构建/重建时自动停止ASP.NET开发服务器(Cassini)(然后显然在需要时再次启动)?也许在某处有一些隐藏的配置设置?或者至少某种方式可以作为一个后期构建活动吗?
对于某些背景,问题是我使用Spring.NET进行依赖注入等,但它在Application Start上加载它的单例,这意味着如果我更改任何与Spring相关的代码/配置,我必须停止开发服务器,所以它再次启动下一次调试/运行,确保再次触发Application Start事件.换句话说,即使您更改了一堆代码/配置然后再次开始调试,它实际上也不会再次启动,因为它已经在运行,因此您的新代码未被使用.
我不确定这是否可能,但我希望找到一条线索,以确定当前正在执行的代码是否在IIS Express下运行.到目前为止,我的最佳近似值,令人难以置信的hackish,肯定会在某些时候失败/突破:
bool IsExpress =
Request.ServerVariables["SERVER_SOFTWARE"] == "Microsoft-IIS/7.5"
&& Int32.Parse(Request.ServerVariables["INSTANCE_ID"]) > 1000000000;
Run Code Online (Sandbox Code Playgroud)
当然必须有更好的方法.我对Application,Server和Request对象的检查似乎没有揭示可能提供更好洞察力的任何内容.也许我只需要看一些其他对象?
更新:
如果有一种方法可以检测到这一点,我真的很好奇 - 在这一点上它确实是学术性的,我没有迫切需要使用它.最初的问题就是.但本着回应评论的精神,特别是我有兴趣回答本网站上另一个问题/答案的批评:如何搜索服务器的MIME地图.批评是,发布的答案不适用于IIS Express,只适用于传统的IIS实例.IIS Express将MIME配置存储在applicationhost.config XML文件中,我想更新该答案,以便为IIS Express提供返回该信息的方法.我当然可以添加一些从XML中获取适当值的代码(Yay for LINQ to XML!)但我真的想让它变得更聪明.为了清楚起见,我不需要帮助解析该文件 - 只是尝试检测代码当前是否在IIS Express引擎中执行时更优雅.
更新2:
IIS 8.0 Express Beta 本周发布,它进一步表明我的问题中的方法很脆弱并且会破坏.虽然它不是针对特定版本的交易破坏者,但考虑到这一点并尝试确保代码至少与今天的已知版本一起使用将会很好.
我有ASP.NET网页,我想为其构建自动化测试(使用WatiN和MBUnit).如何从我的代码启动ASP.Net开发服务器?我不想使用IIS.
我正在使用IIS Express来托管应用程序的Visual Studio 2010中的Web解决方案.我希望构建过程将输出DLL从一些项目复制到主Web应用程序下的目录中.此目录中有一个监视MEF最新的监视.问题是我的构建失败是因为它们无法复制现有的dll,因为每次调试时应用程序都会运行.我想要做的是添加一个构建命令,在构建开始之前停止该站点.
我原本希望能够运行AppCmd停止站点"MySiteName",但appcmd表示站点对象不支持STOP.
有没有办法阻止网站从命令行在iis express中运行?
我正在尝试为我的ASP网站设置一个测试项目.对于某些测试,我想使用selenium来执行端到端测试.
因此我的网站必须运行,以便测试可以访问该网站.
我在运行测试时如何启动我的网站项目?
有没有一种好方法可以在 Visual Studio 中针对同一解决方案中托管于 IIS Express 中的站点运行 .NET MSTest 测试?我以前一直在 IIS 中托管网站。我希望能够在 Visual Studio 中“运行测试”,并在运行测试之前让站点在 IIS Express 中自动启动。我没有看到一个简单的方法来做到这一点;我缺少什么?
(我可以手动启动 IIS Express,然后运行测试,我可以在 Visual Studio 中启动站点,然后运行测试,但我希望在我简单运行测试时启动该站点,然后运行测试。)
asp.net ×3
c# ×3
iis-express ×3
appcmd ×1
asp.net-mvc ×1
c#-4.0 ×1
cassini ×1
com ×1
end-to-end ×1
iis ×1
mstest ×1
selenium ×1