【发布时间】:2021-04-29 12:47:00
【问题描述】:
首先我试着解释一下这个故事。
我想使用 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-Host 构建期间,ASP 无法解析“My ASP Library.dll”-Assembly(在反射中)。 OnAssemblyResolve 事件通过给出正确的路径解决了这个问题。我不确定这是否是正确的解决方案。因为AppDomain.BaseDirectory是一个空字符串,可能是库找不到的原因。
在 AssemblyResolve 事件中;
Assembly::LoadFrom(assemblyFile)
我终于可以启动服务器了,它可以工作了。然后需要使用依赖注入,我的服务无法从控制器解析。 然后我在另一个 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();
}
...控制器
[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 中的错误还是我做错了什么?
提前致谢
【问题讨论】:
-
很难说没有复制项目。有了这种架构,细节就是魔鬼。
-
@SimonMourier 我有它在我的 github。
标签: c++ asp.net-core dependency-injection coreclr