我前几天开发了一个针对.NET 4的应用程序,并将XCOPY安装到Windows XP机器上.我告诉机器的所有者他们需要安装.NET Framework 4来运行我的应用程序,他告诉我他做了(不是一个可靠的来源).当我运行应用程序时,我看到一个消息框,说该应用程序需要.NET Framework 4,我想安装它吗?单击是按钮将我带到Microsoft网站,稍后单击几次,安装了.NET 4,并且应用程序已成功启动.
过去,XCOPY将.NET应用程序安装到没有安装正确.NET版本的计算机上,导致应用程序在启动时崩溃,并且没有向用户显示有用的信息.这次为什么不同?
我喜欢这个功能.我想知道将来如何利用它.
我需要知道给定的字符串是否是有效的DateTime格式字符串,因为字符串可能代表其他东西.我试图DateTime.ParseExact(somedate.ToString(格式)格式),认为它会BARF上是无效的格式,但它没有.
所以我很擅长测试字符串是否只包含"yYmMdDsShH"字符.像std :: string.find_first_not_of这样的东西可以工作,但System.String没有这个.
我认为RegEx可以做到这一点,但我对正则表达式非常弱.
请注意,Linq不适用于此版本(仅限.NET 2.0).
更新
为了澄清,我需要知道给定的字符串是否代表日期时间格式,而不是像这样:
if (input == "some special value")
... // it's a special case value
else if (Environment.GetEnvironmentVariable(input))
... // it's an environment variable name
else if (IsDateTimeFormatString(input))
... // it's a date time format string
else if (input.IndexOfAny(Path.GetInvalidPathChars()) < 0)
... // it's a file path
else
throw new Exception(); // Not a valid input
Run Code Online (Sandbox Code Playgroud)
我可以将DateTime格式字符串限制为仅仅"yYmMdDsShH",或者我也可以在其中添加一些分隔符,这取决于我允许或不允许的内容.
答案摘要
要避免调试器捕获Ctrl + C,请先关闭Visual Studio Hosting Process(在项目属性,Debug选项卡中找到)
如果您使用的是Visual Studio的Express版本,那就是您所能做的一切.
如果您使用的是Pro或更高版本的Visual Studio,您还可以打开Debug> Exceptions ...,Win32 Exceptions,并取消选中Ctrl + C.
作为替代方案,您可以在调试时使用Ctrl + Break,除非像我这样将Ctrl + C连接到您的大脑.
原版的
以下内容已经过编辑.汉斯似乎已经收回了他的答案,但他的提问帮助我缩小了问题陈述:
额外的清晰度
请注意,以下示例是人为的.这只是为了证明这种行为.我更改了ReadKey系列,因为它让人分心.
调试(运行)以下程序:
class Program
{
static void Main()
{
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
}
Run Code Online (Sandbox Code Playgroud)
按Ctrl + C. 调试器将中断,就像在Sleep行上设置断点一样.
你怎么关掉这个?我不希望调试器完全违反Ctrl + C.
VS2008 Pro在家中不会发生这种情况.
我现在已经尝试了VS2008 Express和VS2010 Express(我可以轻松测试它的唯一版本),他们都做到了.这让我相信它是一种Express行为,或者是某个地方可以打开/关闭它.
debugging visual-studio-2010 visual-studio visual-studio-debugging
根据文件:
"如果您希望应用程序使用ComCtl32.dll版本6,则必须添加应用程序清单或编译器指令,以指定如果版本6可用,则应使用该版本."
注意上面的逻辑OR?那么这个神秘的编译器指令是什么?
我有一个原生的Win32 C++应用程序,它完全包含在一个.cpp文件中.没有资源文件,清单文件等.我想保持这种方式,但我也想使用视觉样式.
我将IronPython(2.6.1)嵌入到C#程序集中,并将几个对象暴露给使用PythonEngine.ExecuteFile执行的脚本.我暴露他们
scope.SetVariable("SomeObject", new SomeObject())
Run Code Online (Sandbox Code Playgroud)
要么
engine.Execute("from MyNamespace import SomeObject", scope)
Run Code Online (Sandbox Code Playgroud)
取决于脚本如何使用它们.我的应用程序组件被添加到引擎中
engine.Runtime.LoadAssembly(Assembly.GetExecutingAssembly())
Run Code Online (Sandbox Code Playgroud)
现在一个脚本可以执行help(SomeObject)
并转储好的小帮助信息(*),但它不完整.没有任何对象的事件或属性(当然是公共的)出现,许多"内置"成员也会丢失.
这是奇怪的部分; 如果我启动ipy.exe并执行以下操作:
import sys
sys.path.append('<location of my app>')
import clr
clr.AddReferenceToFile('myapp.exe')
from MyNamespace import SomeObject
help(SomeObject)
Run Code Online (Sandbox Code Playgroud)
我得到了一个不同的转储,包括所有缺少的成员!
为什么两者不同?
奖金问题:假设我让它正常工作,是否可以在我的CLR对象上添加描述性文本到help()的输出?就像你可以在脚本中,你的python本地类型?我的第一个猜测是DescriptionAttribute,但是没有用.
(*)显然,最终的工作脚本不会这样做,但在编写/测试脚本时它非常有用.
回答
这是一个完整的控制台程序,演示了如何导入网站,用标准的python库help()替换无用的内部help().
using System;
using System.Collections.Generic;
using System.Reflection;
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting.Hosting.Providers;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
// Work around issue w/ pydoc - piping to more doesn't work so instead indicate that we're …
Run Code Online (Sandbox Code Playgroud) 根据文档:http://msdn.microsoft.com/en-us/library/x13ttww7.aspx:
volatile关键字可以应用于引用类型.
那么为什么在Nullable<T>
...参考类型上使用是非法的!
请注意,我实际上并不需要在Nullable<T>
字段上使用volatile语义,我偶然遇到了这个错误并且只是好奇.
我经常想写这样的东西:
new Form
{
Text = "Caption",
Controls =
{
new Button { Text = "Button 1", Click = (s, e) => MessageBox.Show("Button 1 Clicked"), Location = new Point(10, 10) },
new Button { Text = "Button 2", Click = new EventHandler(Button2Clicked), Location = new Point(10, 40) },
new Button { Text = "Button 3", Click = Button3Clicked, Location = new Point(10, 70) },
},
}
Run Code Online (Sandbox Code Playgroud)
初始化器语法只是糖,所以为什么编译器不能弄清楚如何为事件订阅生成代码?
给我一些糖,宝贝!
当发明初始化语法时,有人必须考虑事件并拒绝它们.我一直试图想象理由可能是什么,而且我是空白的.
是因为事件是一个可能有多个订阅者的多播对象吗?不,这是一个初始化过程; 没有其他订阅者.[更新]不正确,初始化程序在构造后应用,对象可以订阅自己的事件.
Eric的一个注释:我听说过为什么C#没有实现X特效.在这种情况下,有人已经在那里,实现初始化器.
更新
似乎存在争用/混淆,因为我 …
我写了一个Int128类型,效果很好。我以为我可以通过一个简单的想法来改进它的性能:改进一些笨拙的换档操作。
因为它们在乘法和除法中大量使用,所以改进会产生连锁反应。因此,我开始创建一个动态方法(低调并高调旋转),只是发现没有OpCodes.Rol或OpCodes.Ror指令。
IL有可能吗?
我知道这是一件非常简单的事情,我会讨厌自己不得不问它,但我的脑袋却因桌面上的反复点击而痛苦不堪.我已经阅读了几十个stackoverflow和google结果,这些结果表明以下内容应该有效:
$ ls /usr/local/lib/libusb*
/usr/local/lib/libusb-1.0.a /usr/local/lib/libusb-1.0.so /usr/local/lib/libusb-1.0.so.0.1.0
/usr/local/lib/libusb-1.0.la /usr/local/lib/libusb-1.0.so.0
$ gcc -I ~/libusb-1.0.18/libusb -c test.c
$ gcc -L/usr/local/lib -o test test.o -llibusb
/usr/bin/ld: cannot find -llibusb
collect2: error: ld returned 1 exit status
$ gcc -L/usr/local/lib -o test test.o -llibusb-1.0
/usr/bin/ld: cannot find -llibusb-1.0
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
为什么这不正确?其中一个应该有效,我尝试了很多很多变化.
为了完整性,我正在运行Ubuntu 14.04(新的VM安装).
我从源代码(〜/ libusb-1.0.18)构建了libusb:
./configure --disable-udev
make
sudo make install
Run Code Online (Sandbox Code Playgroud)