我正在开发一个Windows服务,我正在引用一个.NET标准库,我有一个Autofac模块,我将这个库称为A
。我在csproj中有以下PropertyGroup
:
<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
</PropertyGroup>
这是之前引用的Autofac模块:
public class DefaultModule:Module
{
protected override void Load(ContainerBuilder builder)
{
#if net461
builder.Register(context => {
return new BusSettings
{
HostAddress = System.Configuration.ConfigurationManager.AppSettings["HostAddress"],
Username = System.Configuration.ConfigurationManager.AppSettings["Username"],
Password = System.Configuration.ConfigurationManager.AppSettings["Password"],
QueueName=System.Configuration.ConfigurationManager.AppSettings["QueueName"]
};
}).AsSelf();
#else
builder.Register(context => {
var configuration = context.Resolve<IConfiguration>();
return new BusSettings
{
HostAddress = configuration["BusSettings:HostAddress"],
Username = configuration["BusSettings:Username"],
Password = configuration["BusSettings:Password"],
QueueName = configuration["BusSettings:QueueName"]
};
}).AsSelf();
#endif
现在我使用4.61作为Target Framework创建了.NET Framework控制台应用程序。这是我用来加载模块的代码:
//Library A is loaded By ExtractCustomAssemblyModules
List<Assembly> assemblies = ExtractCustomAssemblyModules();
containerBuilder.RegisterAssemblyModules(assemblies.ToArray());//Register custom modules
当我执行containerBuilder.Build()
时,我没有看到Autofac加载模块并注册我在自定义模块中的服务,因此它给了我一个例外,因为它找不到依赖项。现在,我创建了一个.NET Core 2控制台应用程序并完全相同,当时调用containerBuilder.Build()
代码跳转到模块,我看到服务已注册,这次也不例外
为什么不在.NET框架控制台应用程序中加载Autofac模块?
PS:我发现这个blog非常有用,我将第一个目标框架切换到.NET 4.61,正如您在PropertyGroup
中看到的那样,但我仍然看到if中的灰色4.61代码
答案 0 :(得分:2)
让我们用
构建一个样本库frame_to_be_available_and_switch_to_it()
和
namespace MyClassLibrary
{
public class Foo
{
public static string Info { get; } = "Conditionals"
#if net461
+ " net461"
#endif
#if NET461
+ " NET461"
#endif
#if NETCORE
+ " NETCORE"
#endif
#if NETSTANDARD
+ " NETSTANDARD"
#endif
#if NETSTANDARD2_0
+ " NETSTANDARD2_0"
#endif
+ "";
}
}
如果我们使用简单的
在.Net Framework 4.6.1+控制台应用程序中引用此库<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
</PropertyGroup>
</Project>
输出
Conditionals NET461
指令using System;
namespace ConsoleApp.NetCore
{
class Program
{
static void Main( string[] args )
{
Console.WriteLine( MyClassLibrary.Foo.Info );
}
}
}
未知,但net461
已知。
如您所见,尺寸很重要:o)