如何在.NET Core项目中获取类库程序集引用?

6

我有一个ASP.NET Core项目(netcoreapp2.0),它引用了在类库项目(netstandard2.0)中的模型。我正在尝试使用Mapster将存储在类库中的对象映射到其他对象。Mapster的文档指示在Startup.cs中使用以下代码调用Scan方法:

TypeAdapterConfig.GlobalSettings.Scan(assembly1, assembly2, assemblyN)

我的问题在于如何最好地获取程序集引用以传递给Scan方法。我认为这更多是一般的.NET问题,而不是Mapster特定的问题。我能想到的最好方法是以下方法,但感觉有些笨拙。

private Assembly GetAssemblyByName(string name)
{
    var assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies();
    var assemblyName = assemblies.FirstOrDefault(i => i.Name == name);
    var assembly = Assembly.Load(assemblyName);
    return assembly;
}

有没有更好的方法来处理这个问题?

更新:显然,我上面的解决方案会破坏代码优先迁移。有人能建议一种实现这个目标的方法吗?


如果你要对一个问题进行负评,请有礼貌地解释一下为什么。 - Jason
1个回答

9

使用其中定义的类型获取程序集。

var assembly = Assembly.GetAssembly(typeof(NameSpace.TypeName));

根据您的评论更新(但我不推荐这样做):

使用GetExecutingAssembly()来替代GetEntryAssembly(),那么您在提问中的解决方案将不会出现问题。额外奖励: 使用类似.Where(a => a.Name.StartsWith("CompanyName"))过滤GetReferencedAssemblies()的结果,甚至可以摆脱name参数。

我不建议这样做,因为:

  1. 我们将最终硬编码装配名称(直接或间接的),我宁愿使用强类型。引用组件的变化应该会导致构建失败。
  2. 我们将承担启动性能的惩罚。

啊,好的,那很有效。我猜我希望有些东西不依赖于汇编内容的知识,但这让我更接近我的目标。谢谢!如果没有更多以汇编为中心的内容出现,我很快就会将其标记为答案。 - Jason
@Jason 很抱歉回复晚了... 我已经添加了一个更新,它不依赖于对程序集内容的了解(但仍需要对程序集有所了解)。 - galdin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接