Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Asp.Net核心依赖项注入不';如果从非托管/本机启动,则无法工作_C++_Asp.net Core_Dependency Injection_Coreclr - Fatal编程技术网

C++ Asp.Net核心依赖项注入不';如果从非托管/本机启动,则无法工作

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

首先我试着解释这个故事

我想用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是空字符串,可能是库找不到它的原因

在任何情况下

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中有它。