C# Windows应用程序事件:应用程序启动时的CLR20r3

25

我创建了一个C#应用程序并将其安装在测试机上。我的应用程序在开发机上运行得很完美,但是当我在另一台机器上安装它时,在Main()函数中会崩溃,并收到EventType: CLR20r3的错误消息。

以下是错误消息:

    Problem signature:
    Problem Event Name: CLR20r3
    Problem Signature 01:   logfileviewer.exe
    Problem Signature 02:   1.0.0.0
    Problem Signature 03:   4f356c9c
    Problem Signature 04:   LogFileViewer
    Problem Signature 05:   1.0.0.0
    Problem Signature 06:   4f356c9c
    Problem Signature 07:   94
    Problem Signature 08:   44
    Problem Signature 09:   System.IO.FileNotFoundException
    OS Version: 6.1.7601.2.1.0.256.1
    Locale ID:  1033
    Additional Information 1:   0a9e
    Additional Information 2:   0a9e372d3b4ad19135b953a78882e789
    Additional Information 3:   0a9e
    Additional Information 4:   0a9e372d3b4ad19135b953a78882e789

我使用了这些详细信息,并在IL Disassembler中查找了错误代码,得到了以下结果...

    Method #5 (06000094) 
    -------------------------------------------------------
    MethodName: .ctor (06000094)
    Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886)
    RVA : 0x000081d0
    ImplFlags : [IL] [Managed] (00000000)
    CallCnvntn: [DEFAULT]
    hasThis 
    ReturnType: Void
    No arguments.

在系统上已经卸载并重新安装了.NET 4.0,但没有改变任何东西。我在网上搜索了所有人都遇到了同样的问题,但似乎没有解决方法。我现在已经花了一天半的时间来解决这个问题。我不想因为无法启动应用程序而错过截止日期。

这是我Main()中唯一的代码。

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }

这里是来自事件查看器的详细信息

    Application: LogFileViewer.exe
    Framework Version: v4.0.30319
    Description: The process was terminated due to an unhandled exception.
    Exception Info: System.IO.FileNotFoundException
    Stack:
        at LogFileViewer.frmMain.InitializeComponent()
        at LogFileViewer.frmMain..ctor()
        at LogFileViewer.Program.Main()

事件数据

    Application: LogFileViewer.exe 
    Framework Version: v4.0.30319 
    Description: The process was terminated due to an unhandled exception. 
    Exception Info: System.IO.FileNotFoundException 
    Stack: at LogFileViewer.frmMain.InitializeComponent() at LogFileViewer.frmMain..ctor() at LogFileViewer.Program.Main() 

不确定设计师为什么会有“FileNotFound”异常。我正在使用DotNetBar.dll,它是从安装目录引用的,所以应该没问题。如果您愿意,我可以发布我的设计器,但那里有相当多的内容。


2
捕获FileNotFoundException异常并查看其详细信息,以了解缺少哪个文件。我敢打赌它是DotNetBar.dll。 - tenorsax
是的,它是DotNetBar。尽管我从名为“资源”的文件夹中引用它,但我不得不将其移动到应用程序根目录。 - Tyler
5个回答

22

在我的应用程序依赖于一个未安装在部署机器上的被引用程序集时,我看到了相同的问题。我不确定您所说的“从安装目录引用DotNetBar”是什么意思 - 确保在您的项目中将其设置为CopyLocal=true,或者在开发和生产机器上具有相同的完整路径。


是的,或者您可以尝试使用 Smart Assembly 这样的工具,它允许在可执行文件中嵌入依赖项,除了混淆它,这样您就会知道是否是由于缺少 DLL 导致的。 - Digvijay
尽管我是从我创建的资源文件夹引用DotNetBar.dll,但似乎我实际上必须将.dll放在我的.exe所在的根目录中。我没有这方面的解释。也许有人可以启发我一下原因。所以对于其他遇到同样问题的人,将你引用的任何.dll移动到根目录并查看是否解决了问题。 - Tyler
这可能会有所帮助:http://msdn.microsoft.com/zh-cn/library/yx7xezcf(v=vs.71).aspx - RyanR

3

.NET有两个CLR,2.0和4.0。CLR 2.0适用于.NET framework 3.5以前的版本,而CLR 4.0适用于.NET 4.0及以上版本。可能您的解决方案正在使用与您的参考程序集不同的CLR。在本地开发环境中,您可能同时拥有这两个CLRs,因此没有遇到任何问题。但是当您移动到部署环境时,它们只可能有一个CLR,因此您会遇到这个错误。


1
给其他人看到这个问题的:你可以尝试通过更新引用的程序集来解决这个问题,而不是要求客户端安装旧的CLR。我的同事正在将一个项目更新到4.5版本,并遇到了这个问题。我的第一反应是“你更新了NuGet包吗?”果然如此... - Jean-Bernard Pellerin

3

在我在一台之前是XP机器上维护的应用程序上构建一个Windows 7机器时,我遇到了同样的问题。

当以调试模式构建时,程序运行良好,但是在以发布模式构建时出现了此错误。我在项目的属性页面上找到了答案。转到“生成”选项卡,并尝试将平台目标从“Any CPU”更改为“x86”。


0

整个早上都在解决这个问题,现在终于解决了并知道原因了。希望这篇文章能帮助到其他人。

我安装了Krypton.Toolkit,它自动将工具添加到Visual Studio工具箱中。然后我将工具添加到设计器中,这会自动将dll添加到项目引用中,但是工具被标记为CopyLocal=false。

我使用发布版本文件夹中的所有dll构建了一个安装程序(当然上述dll不在其中)。

将copylocal设置为true,然后重新构建安装程序,一切正常。


-4
为解决CLR20r3问题集 - 本地用户策略\计算机配置\Windows设置\安全设置\本地策略\安全选项-系统密码学:使用符合FIPS 140标准的密码算法,包括加密、哈希和签名 - 禁用。

对于那些认为这是一个无用的答案的人,请考虑说明原因。在其他来源中也可以看到同样的推理:clr20r3 - resolution - Caio de Paula Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接