【问题标题】:How to make the generated EXE work in all .NET framework versions?如何使生成的 EXE 在所有 .NET 框架版本中工作?
【发布时间】:2011-10-21 16:20:55
【问题描述】:

我对 .NET 世界很陌生,我有一个小型控制台项目(非常小),它基本上只是引用在 delphi 中创建的 .DLL(大部分重要代码都在其中),在我的 C# 代码中我只有循环、线程睡眠指令和类似的东西。

我的客户正在使用 Microsoft Windows XP SP2、Microsoft XP SP3、Microsoft Windows Vista 和 Microsoft 7。我希望生成能够在所有这些环境中运行的 .EXE。在我的 C# 2010 开发环境中,我有 .NET 框架 4.0,但我猜我客户的一些桌面有框架 3.5 甚至更早的版本。基于这种情况,在新旧版本的 .NET 中创建最便携的 EXE 的最佳选择是什么?

我是初学者,欢迎详细回答。

由于可能是我的简单代码,所以我将其粘贴在这里。

    using System;
    using System.Reflection;
    using System.Threading;
    using System.Web;
    using System.Diagnostics;
    using Redemption;

    namespace test{

class Program
{

    static void Main(string[] args)
    {


        RedemptionLoader.DllLocation64Bit = @"redemption64.dll";
        RedemptionLoader.DllLocation32Bit = @"redemption.dll";

        var ToEmailAddress = args[0];
        var subject = args[1];
        var pathFileAttach = args[2];

        SendMail(ToEmailAddress, subject, pathFileAttach);

    }

    private static void SendMail(string ToMail,string subject,string filePath) 
    {
        var session = new RDOSession();

        try
        {

            session.Logon();

            if (session.LoggedOn)
            {

                var Drafts = session.GetDefaultFolder(rdoDefaultFolders.olFolderDrafts);

                RDOMail msg = Drafts.Items.Add("IPM.Note");

                var body = "Test Redemption.";

                msg.To = ToMail;
                msg.Recipients.ResolveAll();
                msg.Subject = subject;
                msg.Body = body;

                msg.Attachments.Add(filePath);

                msg.Save();
                msg.Send();

                System.Threading.Thread.Sleep(5000);
            }
        }
        finally
        {
            session.Logoff();
            session = null;
        }
    }

}
}

【问题讨论】:

  • 其中一些版本的 Windows 没有默认安装任何版本的框架。

标签: c# dll


【解决方案1】:

针对作为目标框架的 .net 2.0 进行开发和构建,它将与未来的所有版本兼容。

【讨论】:

  • 嗨克里斯宾特。但是怎么做呢?我必须删除 .NET 框架 4 并安装旧的 2.0 并再次编译?谢谢
  • 我仍然偶尔会碰到只安装了 .NET 1.1 的用户。话虽如此,1.1 和 2.0 之间的差异是巨大的,所以我认为您针对 2.0 是正确的。
  • 嗨。感谢帮助。我做到了,将目标更改为框架 2.0 甚至 3.0,但我的控制台应用程序拒绝使用此版本。当我执行这些版本时,窗口说应用程序停止工作。在控制台上,我看到了一个未处理的异常(System.IO.FileNotFoundExecption),下面出现了两行引用我的 DLL 的代码。我的 DLL 是与 Outlook 一起使用的赎回。知道有什么问题吗?如何解决?
  • @user1007489 - 如果您对异常有疑问,请提出新问题,发布确切的异常并寻求帮助。用完全相同的评论回复每一个答案是不礼貌的,基本上相当于垃圾邮件。
【解决方案2】:

在项目菜单中,您可以选择您希望使用的 .net 版本(如 Chris 所说,使用 2.0)。但是要小心,因为有时这样做可能需要一些调整。

见here for a list of changes that may be important to you

还值得注意的是,在您的项目属性下,您可以选择运行应用程序所需的依赖项。它将检查并允许用户在允许安装之前获取这些依赖项,例如某个框架版本。

【讨论】:

  • 嗨。感谢帮助。我做到了,将目标更改为框架 2.0 甚至 3.0,但我的控制台应用程序拒绝使用此版本。当我执行这些版本时,窗口说应用程序停止工作。在控制台上,我看到了一个未处理的异常(System.IO.FileNotFoundExecption),下面出现了两行引用我的 DLL 的代码。我的 DLL 是与 Outlook 一起使用的赎回。知道有什么问题吗?如何解决?
  • 尝试将 dll 重新添加到应用程序右侧的参考文件夹中。如果问题仍然存在,您可能需要提出一个新问题来解决问题并提供屏幕截图来帮助我们。
  • 嗨,KreepN。我点击了添加引用,并在浏览时添加了 Redemption.dll 和 Redemption64.dll,但仍然出现错误。基于大多数经验丰富的开发人员,我认为这可能是我的代码的问题。我把它附在我的主要帖子上。你能看看,让我知道你的想法吗?谢谢。
  • 只要您在项目的“引用”部分下添加了引用,它们应该可以正常工作,但是您所说的代码 @"redemption64.dll";不是有效的位置。它需要一个文件路径。您应该能够删除这两行。如果没有,那么您只需要更正路径本身。
  • KreepN.嗯...但是如果文件路径不正确,为什么它在针对框架 4.0 时有效?我想引用当前文件夹,因为它是我的 DLL 所在的位置。在这种情况下我该怎么办? @".redemption64.dll"; ? @".\redemption64.dll";?再次感谢您的帮助。
【解决方案3】:

请注意,.NET Framework 的 v1.0 和 1.1 极难确保与之兼容。尽管 .NET Framework 的所有版本在技术上都是向后兼容的,但 1.0/1.1 首先是非常基础的(它们甚至没有泛型类型),其次是某些语言和实现细节在 v2.0 发布时发生了显着变化实际上可能与后 2.0 框架不兼容。微软强烈推荐所有 .NET 1.1。程序被重新编译到目标 2.0。

【讨论】:

  • 嗨。感谢帮助。我做到了,将目标更改为框架 2.0 甚至 3.0,但我的控制台应用程序拒绝使用此版本。当我执行这些版本时,窗口说应用程序停止工作。在控制台上,我看到了一个未处理的异常(System.IO.FileNotFoundExecption),下面出现了两行引用我的 DLL 的代码。我的 DLL 是与 Outlook 一起使用的赎回。但是,当我以 .NET 4.0 客户端配置文件为目标时,代码可以完美运行。知道有什么问题吗?如何解决?另外,它生成的名为 myproject.vshost.exe 的文件是什么?
  • 安装 Framework 4.0 后,您应该可以运行针对 2.0 以后的任何框架的应用程序。但是,您可能需要确保您的应用程序知道这一点。在 App.Config 中,您可以使用 SupportedRuntime 元素指定在未安装目标框架的情况下您的应用可以尝试使用的版本。也可能是乔所说的一个实现细节。
  • 嗨基思。我点击了添加引用,在浏览时我添加了 Redemption.dll 和 Redemption64.dll,我还更改了我的目标,并确认它已在 App.Config 上修改 - 但我仍然收到错误。基于大多数经验丰富的开发人员,我认为这可能是我的代码的问题。我把它附在我的主要帖子上。你能看看,让我知道你的想法吗?谢谢。
【解决方案4】:

虽然在这种情况下以框架的 2.0 版本为目标可能是一个好主意,因为您有一个相当简单的应用程序,您还应该创建一个安装程序来检测客户端安装的 .NET 版本并安装正确的如果需要,一个。

有多种方法可以做到这一点,但 ClickOnce 是 Visual Studio 的一部分,并且很容易设置。它不会创建大型安装 exe,因为它会在运行时从 Microsoft 下载所需版本的 .NET。

【讨论】:

  • 嗨。感谢帮助。我做到了,将目标更改为框架 2.0 甚至 3.0,但我的控制台应用程序拒绝使用此版本。当我执行这些版本时,窗口说应用程序停止工作。在控制台上,我看到了一个未处理的异常(System.IO.FileNotFoundExecption),下面出现了两行引用我的 DLL 的代码。我的 DLL 是与 Outlook 一起使用的赎回。知道有什么问题吗?如何解决?
【解决方案5】:

您构建的框架越低,您的应用程序的可移植性就越高。您可以构建的框架取决于您在代码中使用的内容。正如其他人所指出的,请记住,其中一些操作系统仍需要安装相关的 .NET Framework,因为它不包括在内。

【讨论】:

  • 嗨。感谢帮助。我做到了,将目标更改为框架 2.0 甚至 3.0,但我的控制台应用程序拒绝使用此版本。当我执行这些版本时,窗口说应用程序停止工作。在控制台上,我看到了一个未处理的异常(System.IO.FileNotFoundExecption),下面出现了两行引用我的 DLL 的代码。我的 DLL 是与 Outlook 一起使用的赎回。但是,当我以 .NET 4.0 客户端配置文件为目标时,代码可以完美运行。知道有什么问题吗?如何解决?另外,它生成的名为 myproject.vshost.exe 的文件是什么?
【解决方案6】:

.NET 2.0 通常是您想要通用时考虑使用的框架。大多数代码示例都是用 2.0 编写的。但是,您需要意识到您不应该假设默认情况下会安装 .Net。一些较旧的机器将不得不安装它。到目前为止,很少有人至少没有 2.0,但除非您愿意冒险让人们无法安装您的软件并且不知道原因,否则我不会做出假设。默认情况下,Windows XP 不附带 .NET。

【讨论】:

  • 嗨。感谢帮助。我做到了,将目标更改为框架 2.0 甚至 3.0,但我的控制台应用程序拒绝使用此版本。当我执行这些版本时,窗口说应用程序停止工作。在控制台上,我看到了一个未处理的异常(System.IO.FileNotFoundExecption),下面出现了两行引用我的 DLL 的代码。我的 DLL 是与 Outlook 一起使用的赎回。但是,当我以 .NET 4.0 客户端配置文件为目标时,代码可以完美运行。知道有什么问题吗?如何解决?另外,它生成的名为 myproject.vshost.exe 的文件是什么?
  • 没有看到您的代码,您使用的是 4.0 以一种方式起作用的东西,而在 2.0 中它以不同的方式起作用。我想说的是,此时让最终用户安装 4.0。 vshost.exe 只是在 IDE 中运行程序时创建的文件。
  • 嗨乔。我点击了添加引用,在浏览时我添加了 Redemption.dll 和 Redemption64.dll,我还更改了我的目标,并确认它已在 App.Config 上修改 - 但我仍然收到错误。根据您的评论,我的代码可能存在问题。我把它附在我的主要帖子上。你能看看,让我知道你的想法吗?谢谢。
  • 您最常遇到的问题是文件路径。你从 args[2] 得到它。你确定是对的吗?也尽量不要用 var 看看能不能用。
  • 嗨乔。感谢您的回答。我确定它是正确的,特别是因为它适用于 .net 框架 4,而且我使用相同的命令行。另外,我更改为静态名称,同样的问题发生了。还有什么想法吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2022-10-26
  • 2012-01-04
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多