c++ - Asp.Net Core Dependency Injection 不起作用,如果它是从非托管/ native 启动的

标签 c++ asp.net-core dependency-injection coreclr

首先我试着解释这个故事。
我想使用 REST-API 扩展 C++/MFC 应用程序,并决定为此目的在库中使用 Asp.Net-Core 5,方法是将其桥接到带有 C++/CLI 库的非托管代码。 (有一个单独的 ASP 应用程序是双倍的支出,并且需要在 C# 中重写所有逻辑。在这方面 RESTful-Server 应该在同一进程中实现。)
Asp-Host就是这样启动的; C++/MFC -> C++/CLI -> ASP-Library(CLI中引用ASP,Native中引用CLI)
第一个问题是;通过构建主机 Microsoft.Extensions.Hosting.Abstractions-Assembly 无法解决。我发现“我的 CLI 库”.runtimeconfig.json 有错误的框架引用并导致它无法解决。这意味着生成的 runtimeconfig.json 是错误的。每次构建后,必须手动使用 AspNetCore 而不是 NETCore 进行更正。 (在 PostBuildEvent 中完成)
下一个问题;在 ASP 主机构建期间,ASP 无法解析“My ASP Library.dll”-Assembly(在反射中)。 OnAssemblyResolve 事件通过给出正确的路径解决了这个问题。我不确定这是否是正确的解决方案。因为 AppDomain.BaseDirectory 是一个空字符串,可能是找不到库的原因。
在 AssemblyResolve 事件中;

Assembly::LoadFrom(assemblyFile)
最后我可以启动服务器,它工作正常。然后需要使用依赖注入(inject),我的服务无法从 Controller 解析。
然后我在另一个 C# 项目中使用了我的 ASP-Library 进行测试,它可以工作......
如果进程的入口点在非托管代码中,我确信它不起作用。
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();
}
... Controller
[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;
  }
  ...
}
有什么解决方法可以让它工作吗?这些问题是 Asp.Net-Core 中的错误还是我做错了什么?
提前致谢

最佳答案

问题已经解决。使用 Assembly.LoadFrom() 解决程序集事件导致我的 ASP 程序集被加载(或映射)两次。在不同的程序集加载上下文中加载它意味着,加倍类型,静态变量等。在这方面我注册了IServerImpl服务在 Controller 中搜索到另一个 IServerImpl类型。类型名称相同,但不相同。
有关更多信息,请参阅技术挑战:https://docs.microsoft.com/en-us/dotnet/api/system.runtime.loader.assemblyloadcontext?view=net-5.0
GitHub 上的另一个问题:https://github.com/dotnet/runtime/issues/39783
在程序集解析事件中,我现在返回加载的程序集,而不是再次加载它;

AppDomain.CurrentDomain.GetAssemblies()
          .SingleOrDefault(asm => asm.FullName.StartsWith(args.Name.Split(',')[0] + ","))
仍然很好的答案澄清了“为什么我的 ASP 程序集未从框架中找到?”

关于c++ - Asp.Net Core Dependency Injection 不起作用,如果它是从非托管/ native 启动的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67317689/

相关文章:

asp.net-core - 将 JwtBearerOptions 注入(inject) Controller

c# - 如何将此 C# 工作线程代码与共享数据变量的主线程分离?

c# - 如何使用 autofac 注册两个 WCF 服务契约(Contract)

c++ - 填充 std::vector 时出现 "vector<T> too long"错误

python - QGraphicsTextItem 的分页 : Confining text to a specific rectangular area

c++ - SYSTEMTIME 等同于 linux

c++ - 多线程/ fork 服务器守护进程的模型

c# - .Net Core 中的 ServiceCollectionExtensions 类有何用途?

jquery - 如何单独影响每个元素的样式(悬停)

c# - DryIoc 范围和重用