我试图了解.NET的SecureString的目的.来自MSDN:
System.String类的一个实例都是不可变的,当不再需要时,不能以编程方式安排垃圾收集; 也就是说,实例在创建后是只读的,并且无法预测实例何时从计算机内存中删除.因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据.
SecureString对象类似于String对象,因为它具有文本值.但是,SecureString对象的值会自动加密,可以修改,直到您的应用程序将其标记为只读,并且可以通过应用程序或.NET Framework垃圾收集器从计算机内存中删除.
初始化实例或修改值时,SecureString实例的值会自动加密.您的应用程序可以呈现实例不可变,并通过调用MakeReadOnly方法防止进一步修改.
自动加密是最大的收益吗?
为什么我不能说:
SecureString password = new SecureString("password");
Run Code Online (Sandbox Code Playgroud)
代替
SecureString pass = new SecureString();
foreach (char c in "password".ToCharArray())
pass.AppendChar(c);
Run Code Online (Sandbox Code Playgroud)
我错过了SecureString的哪个方面?
我将.Content
Label 的值设置为包含下划线的字符串; 第一个下划线被解释为加速键.
如果没有(更换所有改变基础字符串_
用__
),是有办法禁用标签加速器?
无法找到引用的.dll时是否可以捕获异常?
例如,我有一个C#项目,引用了第三方dll; 如果找不到该dll,则抛出异常.例外是System.IO.FileNotFoundException,但我无法确定将其捕获的位置.以下代码似乎不起作用:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
// code goes here
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在Visual Studio 2008中使用调用msbuild的预构建任务:
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe $(MSBuildProjectDirectory)\version.targets /p:Configuration=$(ConfigurationName)
Run Code Online (Sandbox Code Playgroud)
在version.targets中,我正在更新AssemblyInfo.cs文件以替换版本信息:
<FileUpdate
Encoding="ASCII"
Files="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"
Regex="AssemblyInformationalVersion\(".*"\)\]"
ReplacementText="AssemblyInformationalVersion("Product $(ConfigurationString) ($(buildDate))")]"
/>
Run Code Online (Sandbox Code Playgroud)
当我通过Visual Studio 2008构建项目时,它构建没有任何问题.
但是当我查看生成的exe的版本信息时,它包含上一个时间戳,即使AssemblyInfo.cs已经使用"正确"更改了.
似乎主编译任务没有看到预编译的变化,它总是落后.
我做错了什么想法?
我在字典中存储双打时看到了一些奇怪的东西,我对此感到困惑.
这是代码:
Dictionary<string, double> a = new Dictionary<string, double>();
a.Add("a", 1e-3);
if (1.0 < a["a"] * 1e3)
Console.WriteLine("Wrong");
if (1.0 < 1e-3 * 1e3)
Console.WriteLine("Wrong");
Run Code Online (Sandbox Code Playgroud)
第二个if语句按预期工作; 1.0不小于1.0.现在,第一个if语句的计算结果为true.非常奇怪的是,当我将鼠标悬停在if上时,intellisense告诉我错误,但代码很高兴地移动到Console.WriteLine.
这适用于Visual Studio 2008中的C#3.5.
这是浮点精度问题吗?那为什么第二个if语句有效呢?我觉得我在这里缺少一些非常基本的东西.
任何见解都表示赞赏.
Edit2(重新提出问题):
我可以接受数学精度问题,但我现在的问题是:为什么悬停过度评估正确?中间窗口也是如此.我将第一个if语句中的代码粘贴到中间窗口中,并评估为false.
更新
首先,非常感谢所有伟大的答案.
我也在同一台机器上的另一个项目中重新创建这个问题.看看项目设置,我看不出任何差异.看看项目之间的IL,我认为没有差异.看看反汇编,我发现没有明显的差异(除了内存地址).然而,当我调试原始项目时,我看到: 问题的截图http://i30.tinypic.com/ega874.png
即时窗口告诉我if是否为false,但代码属于条件.
无论如何,我认为最好的答案是在这些情况下为浮点运算做准备.我不能放弃这个的原因更多的是调试器的计算与运行时的不同.非常感谢Brian Gideon和stephentyrone的一些非常有见地的评论.
这是情况:我正在尝试启动一个应用程序,但我不知道.exe的位置.现在,如果文件扩展名已注册(在Windows中),我可以执行以下操作:
Process.Start("Sample.xls");
Run Code Online (Sandbox Code Playgroud)
但是,我还需要传递一些命令行参数.我无法让这个工作
Process p = new Process();
p.StartInfo.FileName = "Sample.xls";
p.StartInfo.Arguments = "/r"; // open in read-only mode
p.Start();
Run Code Online (Sandbox Code Playgroud)
关于解决这个问题的机制的任何建议?
编辑 @ aku
我的StackOverflow搜索技能很弱; 我没找到那个帖子.虽然我一般不喜欢窥探注册表,但这是一个很好的解决方案.谢谢!
我在我们的一个内部dll中遇到了以下代码,我试图了解它显示的行为:
long GetFD(long* fd, const char* fileName, const char* mode)
{
string fileMode;
if (strlen(mode) == 0 || tolower(mode[0]) == 'w' || tolower(mode[0]) == 'o')
fileMode = string("w");
else if (tolower(mode[0]) == 'a')
fileMode = string("a");
else if (tolower(mode[0]) == 'r')
fileMode = string("r");
else
return -1;
FILE* ofp;
ofp = fopen(fileName, fileMode.c_str());
if (! ofp)
return -1;
*fd = (long)_fileno(ofp);
if (*fd < 0)
return -1;
return 0;
}
long CloseFD(long fd)
{
close((int)fd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在使用适当的CloseFD重复调用GetFD之后,整个dll将无法再执行任何文件IO.我写了一个测试程序,发现我可以GetFD 509次,但第510次会出错. …