我有一个Windows Forms应用程序(.NET 4),它在我的开发机器上运行良好但在其他两台测试机器上崩溃.我可以加载它在VS2010中创建的minidump.
选择"混合调试"导致Visual Studio滥用CPU显然无穷无尽(我在大约20分钟后杀死了devenv).
当我"仅使用Native进行调试"时,它找不到源(即使我已将源镜像到测试机器上的同一文件夹中).它简单地说:
YourWinApp .exe.hdmp中0x793f5b8c处的未处理异常 :0xC0000409:0xc0000409.
然后告诉我
调用堆栈位置:clr.dll!793f5b8c()
我如何找出导致应用程序崩溃的原因?在显示"通知Microsoft"对话框时,我可以采取完整的故障转储,这会有所帮助吗?
CPath = (CPath == null) ? Request.Path : CPath;
Run Code Online (Sandbox Code Playgroud)
首先,我希望CLR能让我这样做吗?Request.Path并没有打扰我创建一个:
但我问它会优化它吗?或者仍然分配.
我无法在任何地方找到这些信息,但我确信这只是一个简单的答案.它们可以互换吗?
我必须有一个表单作为gui,但我还需要使用win32 API编写,因为我需要在应用程序启动时创建另一个进程...
我创建了Win32控制台 - >空项目..然后有一个选项将Windows窗体添加为UI ...是否可能???? ...因为我选择了基础项目为win32控制台应用程序.
但我真的需要应用程序中的表单.
System.Runtime.CompilerServices.DiscardableAttribute即使对于原型编译器,我找不到实际用途.任何见解?谢谢.
这个问题更多的是出于好奇而不是真正的问题.请考虑以下代码(C#4.0,如果重要):
class Program {
static Point myPoint = new Point(3, 5);
static void Main(string[] args) {
Console.WriteLine("Point Struct Before: " + myPoint);
object point = GetPoint();
Console.WriteLine("Point Object Before: " + point);
myPoint.X = 10;
Console.WriteLine("Point Struct After: " + myPoint);
Console.WriteLine("Point Object After: " + point);
}
static object GetPoint() {
return myPoint;
}
}
Run Code Online (Sandbox Code Playgroud)
这输出如下:
Point Struct Before: 3;5
Point Object Before: 3;5
Point Struct After: 10;5
Point Object After: 3;5
Run Code Online (Sandbox Code Playgroud)
现在,这应该工作,这意味着返回的点GetPoint()被复制而不是被引用.(否则最后一行也会读"10; 5".)
我现在的问题是:为什么这有效?编译器如何知道是复制还是引用对象?这是否意味着此决定是在运行时而不是在编译期间完成的?
此外,这现在允许我设置point …
在'CLR via C#'的第170页:
public sealed class Program {
public Int32 GetFive() { return 5; }
public static void Main() {
Program p = null;
Int32 x = p.GetFive(); // In C#, NullReferenceException is thrown
}
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,上面的代码很好.当然,变量p是null,但是当调用非虚方法(GetFive)时,CLR只需要知道p的数据类型,即Program.如果GetFive确实被调用,则此参数的值将为null.由于参数未在GetFive方法中使用,因此不会抛出NullReferenceException.
原谅我的愚蠢.我记得CLR通过'this'找到了真正的方法代码,它始终隐含在方法delcare的第一个参数中,为什么它说'当调用非虚方法(GetFive)时,CLR需要只知道p'的数据类型?
我不知道如何解释我的问题,请以示例形式接受:
我用C#语言编写了一个库,其方法如下:
public object GetValueAt(int idx) {
return arr[idx];
}
Run Code Online (Sandbox Code Playgroud)
然后我在VB.Net中使用它,当然在C#和VB.Net之间有一个不同的索引.因此,如果我调用该方法idx = 6,CLR如何知道我尝试访问的对象(它idx = 5在C#上有)?
这只是我的例子,那么.Net中现有的库怎么样?
从很多天起,我正在寻找一个详细的文档,它将帮助我理解CLR完成的垃圾收集,其中包括一些编码行,包括一些函数,类,值类型和引用类型.如果有某些文件逐步显示,请分享.