понедельник, 21 ноября 2011 г.

Вызов кода на C# из программы на Delphi

Обычно решают противоположную задачу - вызов внешних модулей (DLL, COM), написанных на C++, Delphi и т.п., из программы на C#. У меня же возникла необходимость вызвать из программы написанной на Delphi функцию библиотеки, написанной на C#. В этом посте я расскажу о том, как это делается.

Итак, нужно сделать на C# COM объект, к которому затем мы сможем обращаться из нашей программы на Delphi.
  1. В Visual Studio создаем новый проект New/Project/Visual C#/Class Library.
  2. В свойствах проекта на вкладке Application жмем кнопку "Assembly Information" и отмечаем "Make assembly COM-visible".
  3. В свойствах проекта на вкладке Build отмечаем Register for COM interop.
  4. Для регистрации библиотеки вместо regsvr32 нужно использовать regasm. Вызов будет типа такого:

    regasm.exe vcomclasslibrary.dll /tlb:vcomclasslibrary.tlb

    regasm.exe обычно расположен тут:

    c:\Windows\Microsoft.NET\Framework\v2.0.50727\

  5. Код на C#:

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;

    namespace VCOMClassLibrary
    {
    [ComVisible(true)]
    public interface IVCOMInterface
    {
    string LoadImageFromStream(System.IO.Stream stream);
    }

    [ComVisible(true), ClassInterface(ClassInterfaceType.None)]
    public class VCOMClass : IVCOMInterface
    {
    public string LoadImageFromStream(System.IO.Stream stream)
    {
    Image img = Image.FromStream(stream);
    //put code to load image here
    return "OK";
    }
    }
    }
  6. В проекте на Delphi импортируем VCOMClassLibrary (Project/Import Type Library). Пример вызова (в котором я заодно показал как передавать Stream):

    procedure TForm1.Button1Click(Sender: TObject);
    var
    cls: IVCOMInterface;
    Stream: IStream;
    FileStream: TFileStream;
    begin
    cls := CreateComObject(CLASS_VCOMClass) as IVCOMInterface;
    FileStream := TFileStream.Create('c:\temp\1.jpg', fmOpenRead);
    Stream := TStreamAdapter.Create(FileStream, soOwned) as IStream;
    cls.LoadImageFromStream(Stream);
    FileStream.Free;
    end;
===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru

Комментариев нет:

Отправить комментарий