我有一个使用AppDomain.CurrentDomain.AssemblyResolve()
加载未解析程序集的控制台应用程序。我在静态构造函数中连接处理程序,并且我正在记录对处理程序的每次调用。
我的控制台应用正在使用Microsoft.Owin.Hosting.WebApp.Start()
启动自托管的网络服务。
如果我在与.exe
相同的目录中运行带有以下DLL的应用程序,则webservice可以正常运行:
如果我运行的应用程序与这些DLL不在.exe
的同一目录中,应用程序启动,我可以看到每个DLL触发对我的处理程序的调用,我可以看到我的处理程序解析查询,并返回请求的程序集,但Web服务不起作用。
我得到了
调用目标抛出了异常。内部例外:未找到入口点。
我的猜测是OWIN网络服务没有通过初始化应用程序的AssemblyResolve
进程解析其加载的程序集。
OWIN的WebApp()
机制是否使用不同的机制来解决装配负载?
或者还有其他可能发生的事情吗?
如果OWIN确实有自己的程序集解析机制,它在哪里记录,我该如何挂钩呢?
我以为我在这里找到了答案:Self-hosting WebAPI application referencing controller from different assembly
但它不适合我。
我正在启动我的WebApp:
Startup.simpleInjectorContainer = simpleInjectorContainer;
var startOptions = new StartOptions();
startOptions.Urls.Add($"http://localhost:{port}/");
this.webApp = Microsoft.Owin.Hosting.WebApp.Start<Startup>(startOptions);
我的Startup课程:
public class Startup
{
public static Container simpleInjectorContainer;
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration
{
DependencyResolver = new SimpleInjectorWebApiDependencyResolver(Startup.simpleInjectorContainer)
};
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());
WebApiConfig.Register(config);
app.UseWebApi(config);
}
}
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
我的新CustomAssembliesResolver:
public class CustomAssembliesResolver : DefaultAssembliesResolver
{
public override ICollection<Assembly> GetAssemblies()
{
Console.WriteLine("::GetAssemblies()");
var assemblies = base.GetAssemblies();
var assembliesToLoad = new[]
{
"Microsoft.Owin.Diagnostics",
"Microsoft.Owin",
"Microsoft.Owin.Host.HttpListener",
"System.Net.Http.Formatting",
"System.Web.Http",
"System.Web.Http.Owin",
"System.Web.Http.WebHost",
};
foreach (var s in assembliesToLoad)
{
Console.WriteLine($"::Trying to load {s}");
var a = Assembly.Load(s);
if (a == null)
Console.WriteLine($"::Could not load {s}");
else
Console.WriteLine($"::{s} : {a.FullName}");
if (!assemblies.Contains(a))
assemblies.Add(a);
}
return assemblies;
}
}
在使用新的CustomAssembliesResolver替换IAssembliesResolver之后,我发现行为没有区别,而且我没有看到GetAssmblies()被调用。
更多细节。当我在调试器中走动时,我打电话
Microsoft.Owin.Hosting.WebApp.Start<Startup>(startOptions);
当我在Startup.Configuration中遇到一个断点时:
public class Startup
{
public void Configuration(IAppBuilder app)
{
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());
...
}
}
app
参数已抛出FileNotFoundException:“无法加载程序集'Microsoft.Owin'。”。
看起来我需要先加入装配解决方案。
任何想法如何?