C++ Asp.Net核心依赖项注入不';如果从非托管/本机启动,则无法工作
首先我试着解释这个故事 我想用REST API扩展一个C++/MFC应用程序,并决定为此在库中使用Asp.Net-Core 5,方法是使用C++/CLI库将其连接到非托管代码。(拥有一个分离的ASP应用程序的花费是原来的两倍,并且需要重写C#中的所有逻辑。在这方面,RESTful服务器应该在相同的过程中实现。) Asp主机就是这样启动的;C++/MFC->C++/CLI->ASP库(在CLI中引用ASP,在本机中引用CLI) 第一个问题是,;通过构建主机,无法解析Microsoft.Extensions.Hosting.Abstractions-Assembly。我发现,“My CLI Library”.runtimeconfig.json有错误的框架引用,导致无法解析。这意味着生成的runtimeconfig.json是错误的。每次构建后,都必须使用AspNetCore手动更正,而不是使用NETCore更正。(在PostBuildEvent中完成) 下一个问题;在ASP主机生成过程中,ASP无法解析“My ASP Library.dll”-程序集(在反射中)。OnAssemblyResolve事件通过提供正确的路径解决了此问题。我不确定这是否是正确的解决方案。因为AppDomain.BaseDirectory是空字符串,可能是库找不到它的原因 在任何情况下C++ Asp.Net核心依赖项注入不';如果从非托管/本机启动,则无法工作,c++,asp.net-core,dependency-injection,coreclr,C++,Asp.net Core,Dependency Injection,Coreclr,首先我试着解释这个故事 我想用REST API扩展一个C++/MFC应用程序,并决定为此在库中使用Asp.Net-Core 5,方法是使用C++/CLI库将其连接到非托管代码。(拥有一个分离的ASP应用程序的花费是原来的两倍,并且需要重写C#中的所有逻辑。在这方面,RESTful服务器应该在相同的过程中实现。) Asp主机就是这样启动的;C++/MFC->C++/CLI->ASP库(在CLI中引用ASP,在本机中引用CLI) 第一个问题是,;通过构建主机,无法解析Microsoft.Extens
Assembly::LoadFrom(assemblyFile)
最后我可以启动服务器了,它可以工作了。然后需要使用依赖注入,而我的服务无法从控制器解析。
然后,我在另一个C#项目中使用我的ASP库进行测试,它可以正常工作。。。
我确信,如果进程的入口点在非托管代码中,那么它就不起作用
public interface IServerImpl
{
void OnFail(String msg);
}
public class CServerImpl : IServerImpl
{
public void OnFail(String msg)
{
}
}
。。。启动中
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IServerImpl, CServerImpl>();
services.AddControllers();
}
public void配置服务(IServiceCollection服务)
{
services.AddSingleton();
services.AddControllers();
}
。。。控制器
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger;
private readonly IServerImpl _serverImpl;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IServerImpl serverImpl)
{
_logger = logger;
_serverImpl = serverImpl;
}
...
}
[ApiController]
[路线(“[控制器]”)]
公共类WeatherForecastController:ControllerBase
{
专用只读ILogger\u记录器;
专用只读读写器verimpl\u serverImpl;
公共天气预报控制器(ILogger记录器、IServerImpl服务器impl)
{
_记录器=记录器;
_serverImpl=serverImpl;
}
...
}
有什么办法可以让它工作吗?这些问题是Asp.Net-Core中的bug还是我做错了什么
提前感谢问题已经解决了。使用
Assembly.LoadFrom()
解析程序集事件会导致我的ASP程序集被加载(或映射)两次。在不同的程序集加载上下文中加载它意味着,需要使用双重类型、静态变量等等。在这方面,我已注册的iservrimpl
服务使用另一种iservrimpl
类型在控制器中搜索。类型名称相同,但不相同
有关更多信息,请参阅技术挑战:
GitHub上的另一个问题:
在assembly resolve事件中,我现在像那样返回加载的程序集,而不是再次加载它
AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(asm => asm.FullName.StartsWith(args.Name.Split(',')[0] + ","))
still wellcome的回答澄清了“为什么没有从框架中找到我的ASP程序集?”很难说没有复制项目。有了这种架构,魔鬼就在细节中。@SimonMourier我的github中有它。