C#从加载了反射的Com互操作调用函数,导致类型不匹配

本文关键字:函数 不匹配 类型 调用 互操作 加载 反射的 Com | 更新日期: 2023-09-27 18:29:20

我有一个项目,需要从C#调用Dll Interop。

dynamic Sql = variableFromTheEntryPoint;
string query = Sql.FormatSQLExt(ref text, objs);

Sql对象的Interop声明有这样的方法:

[DispId(1610809348)]
string FormatSQLExt(ref string strSQLSt, params object[] vntParams);

如果我在项目中引用DLL并使用以下代码,则此代码将起作用:

Interop.StdPlatBS800.StdBSSQL Sql = variableFromTheEntryPoint as Interop.StdPlatBS800.StdBSSQL;
string query = Sql.FormatSQLExt(ref text, objs);

我不能用这种方式,因为interop是一个每周更新的ERP,我无法控制何时更新。我已经在使用AppDomain.CurrentDomain.AssemblyResolve来修复大部分更新。它运行良好,DllInterop的大多数更新都不会破坏代码。

问题是当Interop的接口发生变化,然后我的代码中断时,因为我的Dll的接口与新版本不同。

我希望只有当我在interop中使用的方法发生更改时,我的代码才能停止工作。

有什么想法吗?

C#从加载了反射的Com互操作调用函数,导致类型不匹配

在您的情况下,如果可能的话,我会考虑平台调用而不是COM互操作。看起来您的COM互操作代码包含[DispId]属性,如果接口发生更改,这些属性可能会发生更改,正如您所经历的那样。还有许多其他标识符也是COM程序集注册的一部分。

相反,通过[DllImport]的平台调用可以简化这种后期绑定。MSDN上有基本文档。您可以创建一个具有方法声明的类,例如:

[DllImport("YourVendorLibrary.dll")]
public static extern string FormatSQLExt(string strSQLSt, object[] vntParams);

请注意在[DllImport]语句中使用完整路径或相对路径的含义。如果使用完整路径,则更改路径需要重新编译。