【问题标题】:.NET component in DELPHI 2009DELPHI 2009 中的 .NET 组件
【发布时间】:2023-03-19 05:39:01
【问题描述】:

能否告诉我.NET 组件是否可以与 Delphi 2009 一起使用,如果可以,请给我一些示例代码。

提前致谢。

【问题讨论】:

    标签: .net delphi components delphi-2009


    【解决方案1】:

    是的,可以在 win32 程序中使用 .net 组件。不幸的是,自己做起来并不简单,我强烈推荐Hydra

    【讨论】:

      【解决方案2】:

      Win32 的 Delphi 中没有。

      您可以为此使用 Delphi PRISM。

      您也可以查看CrossTalkHydra

      【讨论】:

        【解决方案3】:

        有几种方法可以做到这一点,传统的 COM/Interop 只是其中一种方法。

        另一种方法是使用 CLR 中内置的现有基础架构来支持 COM/Interop 和混合模式 C++/CLI。

        • CLR 非常支持编组与 IUnknown 之间的接口引用(并且每个 Delphi 接口都满足该要求)
        • 您可以将 .Net 程序集转换为真正的 DLL 并使用任何语言导出函数
        • 我编写了一个完全透明的 MSBuild 任务:http://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports
        • 结合这两件事,您可以将 .Net 组件作为接口参考,而无需与 COM 和 clsids/progids 进行斗争

        你很幸运,我已经在另一个论坛上回答了一个非常相似的问题。所以我已经有了一些示例代码。 ;-)

        我在这里展示的可能不是你的那杯茶。

        • 它至少需要一些 .Net 知识,您可能不想过多地参与其中。
        • 双方都需要手动步骤,即使您获得的灵活性很容易使其物有所值,但灵活性可能根本不是必需的。因此,经典 COM 可能是一种选择。

        归根结底,我自己不会使用经典 COM。除非它真的有意义。 (就像为 Office 编写 COM-Addins)

        在 VisualStudio 中,您可以使用重构/提取接口向导从您的组件中获取具有您需要的方法的接口。

        你需要提供这3个属性

        [ComVisible(true)] 
        [Guid("Create a GUID yourself"), 
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IYourInterface
        
        • “ComVisible”是必需的,否则 CLR 不会创建所需的运行时可调用包装器 (RCW)(将从 Delphi 中看到)
        • 需要 GUID 来识别接口,在 Delphi 和 .Net 版本的接口中 GUID 必须相同
        • “ComInterfaceType.InterfaceIsIUnknown”告诉 CLR RCW 应该实现 IUnknown。 没有它,您将无法在 Delphi 中使用它。因为在 Delphi 中,每个接口都是 IUnknown。

        为了简单起见,我假设你的组件只有一个简单的方法。 在 VisualStudio 中创建一个类库,然后按照其他页面中的步骤进行操作。 (为了能够导出函数)

        [ComVisible(true)] 
        [Guid("Create a GUID yourself"), 
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IYourInterface
        {
           void DoSomething(int value);
        }
        
        public class YourComponent : IYourInterface
        {
           public void DoSomething(int value)
           {
             return value + 1;
           }
        }
        
        static class Exports
        {
           [DllExport("createyourcomponent")]
           public static void CreateInstance([MarshalAs(UnmanagedType.Interface)]out IYourInterface instance)
           {
             instance = new YourComponent();
           }
        }
        

        在 Delphi 中,您可以根据需要将此接口包装在组件中。 这将隐藏涉及 .Net 的事实:

        type
          IYourInterface = interface
          ['{Create a GUID yourself}']//Control+Shift+G in Delphi
            // important, safecall is used by COM/Interop
            procedure DoSomething(aValue : Integer); safecall; 
          end;  
        
          TYourComponent = class(TComponent)
          private
            fInnerInstance : IYourInterface;
          public
            procedure DoSomething(aValue : Integer);
            constructor Create(aOwner : TComponent);
          end;
        
        implementation
        
        procedure CreateManagedInstance(out aInstance : IYourInterface); 
          stdcall; external 'YourDotNetLibraryName' 
                       name 'createyourcomponent';
        
        constructor TYourComponent.Create(aOwner : TComponent);
        begin
          inherited Create(aOwner);
          CreateManagedInstance(fInnerInstance);
        end;
        
        procedure TYourComponent.DoSomething(aValue : Integer);
        begin
          fInnerInstance.DoSomething(aValue);
        end;
        

        免责声明:我手边没有 IDE,因此示例代码中可能存在拼写错误或其他错误...

        【讨论】:

          【解决方案4】:

          您可以将 .NET 组件与作为 RAD 工作室的一部分的 Delphi for .NET 一起使用

          【讨论】:

          • 不再是,Delphi.NET 自 2009 年以来已被 Delphi Prism 取代。
          • Delphi for .NET 是 Rad Studio 2009 的一部分
          猜你喜欢
          • 2011-05-03
          • 2010-10-05
          • 2011-05-05
          • 2012-03-05
          • 2023-03-14
          • 2016-03-17
          • 1970-01-01
          • 2010-11-23
          • 1970-01-01
          相关资源
          最近更新 更多