问题描述
我想在Visual Studio中创建一个C#.Net dll作为Enterprise Architect的加载项。 该dll必须注册才能用于Enterprise Achitect使用的com-interop。
在此dll中,我还想使用代码优先和nuget包microsoft.entityframework.core进行数据库迁移。 如果未选中项目属性构建中的com-interop复选框,则此数据库迁移可与Visual Studio中的paket管理器控制台一起正常工作。 如果选中,我的dll无法编译。 错误消息是:
程序集“ .... dll”无法注册。程序集“ Microsoft.EntityFrameworkCore,版本3.1.8 ...”的类型“ Microsoft.EntityFrameworkCore.DbContext”中的方法“ disposeAsync” 没有实现。
在我的原始代码中,我没有具有任何dispose或类似功能的函数。这是一个简单的项目,只有几行代码。 我尝试使用旧版本的Microsoft.EntityFrameworkCore在nuget包管理器中对其进行管理,但没有帮助。 另外,我在代码中覆盖了disposeAsync函数,但这也无济于事。
相关代码位于上下文类中与DbContext对应的行:
using Microsoft.EntityFrameworkCore;
namespace ...
{
public class .. : DbContext
{
在Google中我什么都找不到,所以请帮助我。
解决方法
该问题可能是由您的项目和集成了您的加载项的产品中的不同程序集版本引起的。
示例:
- 您在项目中使用了一些名为 System.dll 版本 2.0 的 NuGet 包
- 使用相同程序集安装插件的产品,但版本不同(System.dll 版本 1.0)。
- 当您的插件加载到目标产品时,它会加载所有必需的引用程序集,但如果已加载同名程序集,它会使用已加载的程序集(而不是您在构建时使用的实际程序集)。
- 如果版本不同,您会得到一些奇怪的例外,例如您问题中的例外或任何其他奇怪的事情。
尝试发现您需要在项目中更改哪个程序集版本,以避免 dll 版本不匹配。尝试使用 FusionLog 进行调查。请注意,问题 dll 可能不是 Microsoft.EntityFrameworkCore,而是 EntityFramework 依赖的任何程序集。不幸的是,没有直接说明如何解决您的问题。将程序集动态添加到第 3 方程序集是一件非常棘手的事情。