2014-11-05 1 views
-1

У меня есть проект, где мне нужно вызвать Dll Interop с C#.C# Вызвать функцию из Inter-взаимодействия, загруженного Reflection, дает несоответствие типа

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

Interop Декларация объекта Sql есть этот метод, как это:

[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 для исправления большинства обновлений. он отлично работает, и большинство обновлений Dll Interop не нарушают код.

Проблема заключается в том, что интерфейс Interop изменяется, а затем мой код прерывается, потому что интерфейс моей Dll отличается от новой версии.

Я хотел бы, чтобы мой код переставал работать только тогда, когда были изменены методы, которые я использовал из interop.

Любые идеи?

ответ

0

В вашей ситуации я бы рассмотрел возможность вызова платформы, а не COM-взаимодействия, если это возможно. Похоже, ваш COM-код взаимодействия включает в себя атрибуты [DispId], которые могут измениться, если интерфейс изменится, как вы, кажется, испытываете. Существует ряд других идентификаторов, которые также являются частью регистрации COM-сборки.

В отличие от этого, платформа invoke через [DllImport] может упростить этот вид позднего связывания. Основная документация находится на MSDN. Вы бы создать класс с методами деклараций, как:

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

Обратите внимание на implications of using a full or relative path в [DllImport] заявлении. Если вы используете полный путь, изменение пути требует перекомпиляции.

+0

Thx для информации, но поскольку «FormatSQLExt» находится внутри класса StdBSSQL, внутри находится StdPlatBS800, как DllImport знает, где эта функция объявлена? – 1st4ck