Вопрос по interop, c# – Использование COM DLL из C # без библиотеки типов

11

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededDllUnregisterServer, DllRegisterServer, DllCanUnloadNow а такжеDllGetClassObjectError: User Rate Limit Exceeded

UPDATE: Я пытался реализовать предложение Джеффа, но я получаю эту ошибку:

"Unable to cast COM object of type 'ComTest.ResSrvDll' to interface type 'ComTest.IResSrvDll'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{75400500-939F-11D4-9E44-0050040CE72C}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."

Это то, что я сделал:

Я получил это определение интерфейса от одного из Delphi-парней:

unit ResSrvDllIf;

interface

type
   IResSrvDll = interface
   ['{75400500-939F-11D4-9E44-0050040CE72C}']
    procedure clearAll;

    function  ResObjOpen(const aClientID: WideString; const aClientSubID: WideString;
                         const aResFileName: WideString; aResShared: Integer): Integer; {safecall;}
    ...
   end;
implementation
end.

Error: User Rate Limit Exceeded

using System.Runtime.InteropServices;
namespace ComTest
{
    [ComImport]
    [Guid("75400500-939F-11D4-9E44-0050040CE72C")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IResSrvDll
    {
        int ResObjOpen(string aClientID, string aClientSubID, string aResFileName, int aResShared);

    }
}

Error: User Rate Limit Exceeded

using System.Runtime.InteropServices;

namespace ComTest
{
    [ComImport]
    [Guid("75400503-939F-11D4-9E44-0050040CE72C")]
    public class ResSrvDll
    {
    }
}

UPDATE

Error: User Rate Limit Exceededexactly! то есть. тот же порядок, те же имена и т. д.

Error: User Rate Limit Exceeded toxvaerd
Error: User Rate Limit Exceeded Scott Langham

Ваш Ответ

7   ответов
1

2

Я не знаю VB и хотел бы не включать больше языков в микс. Должно быть возможно найти решение, используя только C #. Но спасибо за ваш ответ :-) toxvaerd
0

dynamic

12

Это выглядит многообещающе ... Я попробую! toxvaerd
2

1

myObject.GetType().InvokeMember(
                      "ResObjOpen",  // method name goes here
                      BindingFlags.InvokeMethod,
                      null,
                      myObject,
                      new object[] { 
                         someClientID,   // arguments go here
                         someSubId, 
                         somFileName, 
                         someInt} );

dynamic

EDIT:

IResSrvDll

Edit again:ComInterfaceTypeIDispatchIDispatchIUnknown

На самом деле они не одинаковы ... Я подозревал одно и то же, но восьмая цифра отличается. Парни из Delphi сказали, что именно так Delphi создавал гидов. toxvaerd
Это дает мне «COM-цель не реализует IDispatch». Кроме того, я хотел бы избежать использования отражения. toxvaerd
См редактировать - это должен быть неправильный IID тогда.
Хорошо - мне удалось создать экземпляр, да, но я не могу привести его к типу интерфейса. toxvaerd
Правильно - убедительно предположить, что он не поддерживает этот интерфейс, а не буквально. Он может поддерживать только низкоуровневый интерфейс, называемый IDispatch. Пример кода выше работает внутри, используя IDispatch для выполнения вызова. Ты это пробовал?
1

myObject.InvokeMember("NameOfTheMethod", options, params, etc.)).

Это требует, чтобы объект поддерживал позднюю привязку. Не все объекты реализуют IDispatch.

Похожие вопросы