Nancy模块在ILMerge之后自动发现不工作

时间:2013-04-18 12:29:31

标签: c# nancy ilmerge

当我在Visual Studio中运行我的Nancy自主应用程序时,一切都按预期工作但当我使用ILMerge创建一个allInOne.exe时,我只是在每个Url上获得404.

这是ILMerge命令:

ILMerge.exe /target:console /out:allInOne.exe application.exe "Nancy.Hosting.Self.dll" "Nancy.dll"

问题是没有一个模块是自动发现的,因此没有路由是可用的。 问题也只发生在Merged Exe文件中。当我在/ bin / release中运行application.exe时,一切正常。

最好的问候

2 个答案:

答案 0 :(得分:1)

默认情况下,它不会扫描“Nancy”所在的程序集(通常是Nancy.dll)。现在你已经合并了它们,它将排除整个合并的程序集。您可以通过重写此方法来更改行为,以便它不会排除Nancy程序集(TypesOf调用中的true标志)

https://github.com/NancyFx/Nancy/blob/master/src/Nancy/Bootstrapper/NancyBootstrapperBase.cs#L94

答案 1 :(得分:1)

根据我的经验,我发现需要两个部分。首先,像Andreas建议的那样覆盖引导程序中的Modules属性:

protected override IEnumerable<ModuleRegistration> Modules
{
    get
    {
        return
            AppDomainAssemblyTypeScanner
                    .TypesOf<INancyModule>(ScanMode.All)
                    .NotOfType<DiagnosticModule>()
                    .Select(t => new ModuleRegistration(t))
                    .ToArray();
    }
}

其次,当您创建Nancy主机时,请使用带有引导程序实例的重载:

using (var host = new NancyHost(new Bootstrapper(), new Uri(uri)))
{
    host.Start();
    // Do your thang
}

我最初使用的是只接受Uri的重载,但在运行ILMerged主机时仍无法点击我的端点。我的猜测是Nancy还会自动发现 bootstrapper ,并且如果它出现在Nancy的程序集中,也无法找到它。