【发布时间】:2021-12-03 17:56:51
【问题描述】:
更新:
这个问题比我想象的要难解释。
- 我有 2 个项目。 (.NET 6.0)
- 每个项目都是一个 NuGet 包。
- 包不能相互依赖。 (每一个都必须能够单独使用。)
- 如果包
B检测到包A引用(我的意思是在.csproj文件中使用<ProjectReference>或<Package Reference>标记 - 它应该加载包A 并执行一种方法。
现在我已经做到了:
(包B代码)
try {
var assembly = Assembly.Load("A");
var type = assembly.GetTypes.FirstOrDefault(t => t.Name == "MyKnownType");
var instance = (IApiOfA)Activator.CreateInstance(t);
instance.MethodOfA(someDataIHaveInB);
}
catch { }
我讨厌滥用异常。我的问题是如何跳过异常部分。
查询AppDomain.CurrentDomain 无济于事——它只会获取已加载的程序集。
Assembly.GetEntryAssembly().GetReferencedAssemblies() 也不起作用,当我显式加载它时,它甚至不显示我的目标程序集。
AppDomain.CurrentDomain.Evidence 在 .NET 6.0 中不可用。
有什么线索吗?
另一个更新: 这个:Check if Assembly Exists by name before loading it
正如其他人所说:异常并不总是那么糟糕。也许它们不是最优雅的方式,但有一个权衡。一项简单的检查将在应用程序开发中节省大量时间。软件包的作用很容易被忽略,并导致浪费大量时间来弄清楚为什么它不起作用。现在,当 A 和 B 包含在项目中时,将始终进行正确的交互,并且两者都不会失败。如果只有其中一个包 - 没有问题,则问题不存在。如果两者都使用,它们会合作。所以我只是在寻找一个微优化:)
【问题讨论】:
-
“引用”有两种定义,不清楚您指的是哪一种:(a) 项目构建系统中的引用导致将
/r:参数传递给 C# 编译器或 (b) 用法在来自其他 DLL 的 MDTOKEN 值的编译程序集中。 -
特别是“.NET 自动加载程序集,当它被我的项目文件引用时”绝对不是真的。当您调用包含来自其他程序集的 MDTOKEN 的方法时,或者当您加载其成员签名使用来自其他程序集的类型的类型时,会自动加载依赖项。 JIT 编译和加载依赖非常懒惰。
-
@BenVoight:当然,我使用了错误的措辞,通过引用我的意思是通过执行方法或属性来使用类型。然后加载程序集,确实,它是惰性的。
-
@RyanWilson:不,它没有回答我的问题。 .NET 6.0 没有
Evidence属性。 -
@BenVoigt:我的意思是在
.csproj文件中引用PackageReference或ProjectReference标签。我必须澄清 - .NET 6.0。