Вызов кода на C# из программы на Delphi
Обычно решают противоположную задачу - вызов внешних модулей (DLL, COM), написанных на C++, Delphi и т.п., из программы на C#. У меня же возникла необходимость вызвать из программы написанной на Delphi функцию библиотеки, написанной на C#. В этом посте я расскажу о том, как это делается.
Итак, нужно сделать на C# COM объект, к которому затем мы сможем обращаться из нашей программы на Delphi.
В Visual Studio создаем новый проект New/Project/Visual C#/Class Library.
В свойствах проекта на вкладке Application жмем кнопку “Assembly Information” и отмечаем “Make assembly COM-visible”.
В свойствах проекта на вкладке Build отмечаем Register for COM interop.
Для регистрации библиотеки вместо regsvr32 нужно использовать regasm. Вызов будет типа такого:
regasm.exe vcomclasslibrary.dll /tlb:vcomclasslibrary.tlb
regasm.exe обычно расположен тут:
c:\Windows\Microsoft.NET\Framework\v2.0.50727\
Код на 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";
}
}
}В проекте на 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