1

我有一个用 .NET 编写的 Windows 服务,我使用探测功能将 dll 加载到这个 Windows 服务。但是,当我打开命令提示符并尝试使用 installutil.exe 安装 Windows 服务时,出现错误,例如:“System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息. 中止安装",

另一方面,当我将dll移动到与windows服务相同的文件夹中并重复安装过程时,windows服务安装成功。

您对这个问题有什么想法或建议吗?.NET的windows服务安装是否存在探测问题?

4

2 回答 2

1

我在我的项目中遇到了同样的问题,在我的 Windows 服务项目中,我有以下app.config部分:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="SDK" />
    </assemblyBinding>
</runtime>

如果我将服务作为控制台执行,一切都很好,但是当我尝试安装它时 installutil 失败并且我得到了同样的异常,所以我的解决方案是通过命令行自行安装服务:像这样:

cmd: hotspotcenter -i <service_name="service name">
// service_name i made it optional

安装程序类助手:

internal static class BasicServiceInstaller
{
    public static void Install(string serviceName)
    {
        CreateInstaller(serviceName).Install(new Hashtable());
    }

    public static void Uninstall(string serviceName)
    {
        CreateInstaller(serviceName).Uninstall(null);
    }

    private static Installer CreateInstaller(string serviceName)
    {
        var installer = new TransactedInstaller();
        installer.Installers.Add(new ServiceInstaller
        {
            ServiceName = serviceName,
            DisplayName = serviceName,
            StartType = ServiceStartMode.Manual
        });
        installer.Installers.Add(new ServiceProcessInstaller
        {
            Account = ServiceAccount.LocalSystem
        });
        var installContext = new InstallContext(
            serviceName + ".install.log", null);
        installContext.Parameters["assemblypath"] =
            Assembly.GetEntryAssembly().Location;
        installer.Context = installContext;
        return installer;
    }
}

在服务项目的主条目中:

 if (Environment.UserInteractive)
 {
            bool install = false;
            bool uninstall = false;
            string serviceName = "YourDefaultServiceName";

            var p = new OptionSet()
              .Add<bool>("i|install", "Install Windows Service", i => install = i)
              .Add<bool>("i|install=", "Install Windows Service", i => install = i)
              .Add<bool>("u|uninstall", "Uninstall Window Service", u => uninstall = u)
              .Add<string>("sn|service_name=", "Service Name", n => serviceName = n);

            p.Parse(args);

            if (install)
            {
                BasicServiceInstaller.Install(serviceName);
                return;
            }
            else if (uninstall)
            {
                BasicServiceInstaller.Uninstall(serviceName);
                return;
            }

            // if no install or uninstall commands so start the service as a console.
            var host = new YourService();
            host.Start(args);
            Console.ReadKey();
        }
        else
        {
            ServiceBase.Run(new HotspotCenterService());
   }
于 2018-02-12T23:06:53.550 回答
0

如果没有确切的信息,我建议如下:

  • 检查异常详细信息以查看究竟出了什么问题
  • 使用Fusion Log Viewer,查看哪些程序集绑定失败
  • 检查您的探测配置是否与您的部署匹配

探测按此处所述进行配置。

于 2012-10-10T16:03:03.030 回答