2008-11-03 7 views
12

मैं डेल्फी प्रोग्राम के भीतर से कुछ .NET कोड का उपयोग करने की तलाश में था, मुझे अपने प्रोग्राम को .NET असेंबली और पूर्वनिर्धारित फ़ंक्शंस (मैं पहले से ही नियमित डीएलएल का समर्थन करता हूं) का उपयोग करके एक्स्टेंसिबल बनाना होगा।डेल्फी प्रोग्राम में .NET रनटाइम को होस्ट करना

ऑनलाइन खोज करने के बाद, मुझे Managed-VCL मिला, लेकिन मुझे जो चाहिए, उसके लिए मैं $ 250 का भुगतान करने के लिए तैयार नहीं हूं, मुझे कोड के साथ कुछ न्यूज ग्रुप भी अपूर्ण हैं और काम नहीं करते हैं।

मैं Win32 के लिए डेल्फी 2007 का उपयोग कर रहा हूं। पूर्वनिर्धारित पैरामीटर वाले असेंबली से फ़ंक्शन को गतिशील रूप से निष्पादित करने के लिए मैं क्या उपयोग कर सकता हूं?

कुछ की तरह:

procedure ExecAssembly(AssemblyFileName:String; Parameters: Variant); 

मैं बस को जोड़ने के लिए है कि मैं, एक मनमाना विधानसभाओं (शायद सभी एक विशिष्ट फ़ोल्डर में विधानसभाओं) लोड करने के लिए तो एक सी # आवरण काम नहीं कर सकता बनाने में सक्षम होना चाहिए चाहते हैं।

उत्तर

7

जेडी कोड लाइब्रेरी (JCL) में - मुफ्त - एक JclDotNet.pas है, एक वर्ग TJclClrHost युक्त, शायद कर आप क्या चाहते हैं:

TJclClrHost = class(TJclClrBase, ICorRuntimeHost) 
    private 
    FDefaultInterface: ICorRuntimeHost; 
    FAppDomains: TObjectList; 
    procedure EnumAppDomains; 
    function GetAppDomain(const Idx: Integer): TJclClrAppDomain; 
    function GetAppDomainCount: Integer; 
    function GetDefaultAppDomain: IJclClrAppDomain; 
    function GetCurrentAppDomain: IJclClrAppDomain; 
    protected 
    function AddAppDomain(const AppDomain: TJclClrAppDomain): Integer; 
    function RemoveAppDomain(const AppDomain: TJclClrAppDomain): Integer; 
    public 
    constructor Create(const ClrVer: WideString = ''; 
     const Flavor: TJclClrHostFlavor = hfWorkStation; 
     const ConcurrentGC: Boolean = True; 
     const LoaderFlags: TJclClrHostLoaderFlags = [hlOptSingleDomain]); 
    destructor Destroy; override; 
    procedure Start; 
    procedure Stop; 
    procedure Refresh; 
    function CreateDomainSetup: TJclClrAppDomainSetup; 
    function CreateAppDomain(const Name: WideString; 
     const Setup: TJclClrAppDomainSetup = nil; 
     const Evidence: IJclClrEvidence = nil): TJclClrAppDomain; 
    function FindAppDomain(const Intf: IJclClrAppDomain; var Ret: TJclClrAppDomain): Boolean; overload; 
    function FindAppDomain(const Name: WideString; var Ret: TJclClrAppDomain): Boolean; overload; 
    class function CorSystemDirectory: WideString; 
    class function CorVersion: WideString; 
    class function CorRequiredVersion: WideString; 
    class procedure GetClrVersions(VersionNames: TWideStrings); overload; 
    class procedure GetClrVersions(VersionNames: TStrings); overload; 
    property DefaultInterface: ICorRuntimeHost read FDefaultInterface implements ICorRuntimeHost; 
    property AppDomains[const Idx: Integer]: TJclClrAppDomain read GetAppDomain; default; 
    property AppDomainCount: Integer read GetAppDomainCount; 
    property DefaultAppDomain: IJclClrAppDomain read GetDefaultAppDomain; 
    property CurrentAppDomain: IJclClrAppDomain read GetCurrentAppDomain; 
    end; 
+4

क्या मैं अंधा हूं या इसका कोई उदाहरण नहीं है इसका उपयोग कैसे करें? –

2

आप डेल्फी में COM ऑब्जेक्ट के रूप में नेट वर्गों का उपयोग कर सकते हैं:

  • विधानसभा के लिए प्रकार लायब्रेरी बनाने
  • डेल्फी में
  • आयात प्रकार लायब्रेरी
  • अब

    • सी # में विधानसभा बनाने आप टाइप लाइब्रेरी में निर्यात किए गए .NET असेंबली से कक्षाओं तक पहुंच सकते हैं।

    6

    मैं आपको पहले हाथ अनुभव से बता सकता हूं कि डेल्फी से .NET के साथ इंटर-ऑपरेटिंग कोई पिकनिक नहीं है। मैं एक नेट लड़का हूं, लेकिन थोड़ी देर के लिए नेट और डेल्फी की दुकान में काम किया। मैंने कई परियोजनाओं को प्रबंधित किया जो नेट (विनफॉर्म और डब्ल्यूपीएफ) में लिखे गए थे लेकिन डेल्फी ने उन्हें बुलाया था। हमारे डेल्फी लोगों ने डेल्फी के लिए एक इंटरऑप परत लिखी थी ताकि नेट पुस्तकालयों को बुलाया जा सके क्योंकि हमारे सभी नए उत्पादों को नेट में लिखा जा रहा था। यह हमारे लिए परेशानी थी (और ये अच्छे डेल्फी डेवलपर्स थे)। अगर हम हमारे लिए इंटरऑप करने के लिए अच्छा तृतीय पक्ष लाइब्रेरी खरीदा हो सकता था, तो यह इसके लायक से अधिक होता। मैं शर्त लगाता हूं कि हमने डेल्फी से .NET तक इंटरऑप के साथ मैन-घंटे लेखन और डिबगिंग समस्याओं में हजारों डॉलर खर्च किए।

    मैं यह परीक्षण करने के लिए एक प्रबंधित ड्राइव के लिए प्रबंधित-वीएलसी लाइब्रेरी लेगा कि यह कितना अच्छा काम करता है। यदि यह अपने विज्ञापन तक रहता है, तो यह $ 250 के लायक है।

    7

    सीएलआर को होस्ट करना स्वयं इतना मुश्किल नहीं है (विशेष रूप से यदि आप केवल एक ऐपडोमेन का उपयोग कर रहे हैं)। आप रनटाइम को शुरू करने, असेंबली लोड करने, ऑब्जेक्ट बनाने और उन पर विधियों का आह्वान करने के लिए COM आधारित होस्टिंग API का उपयोग कर सकते हैं।

    ऑनलाइन बहुत सारी जानकारी है, उदाहरण के लिए "Hosting the Common Language Runtime" पर एमएसडीएन दस्तावेज।

    +0

    मुझे 'फ़ाइल या असेंबली लोड नहीं हो सका' RGiesecke.DllExport.Metadata, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = ad5f9f4a55b5020b 'या इसकी निर्भरताओं में से एक प्राप्त करें। सिस्टम निर्दिष्ट फ़ाइल नहीं ढूंढ सकता। 'मैं उस पैकेज का उपयोग कर रहा हूं क्योंकि '[DllExport]' एनोटेशन है। प्रश्न [यहां] (http://stackoverflow.com/q/23383839/675577) – dialex

    3

    मुझे यह वही समस्या थी। मैंने डेल्फी की दुकान में काम किया और वे एक विरासत डेल्फी ऐप में .NET और C# के साथ कार्यक्षमता जोड़ने शुरू करना चाहते थे। मैंने प्रबंधित-वीएलसी को देखा और मैंने इसे छोड़ने का फैसला किया, क्योंकि मुझे लगा कि इसमें कुछ गंभीर समस्याएं थीं। मुझे यहां कुछ आसान मिला: Delphi.NET। नोट: यह डेल्फी का संस्करण है जो .NET पर मूल रूप से चलता है। यह एक ओपन सोर्स प्रोजेक्ट है जो विरासत डेल्फी ऐप्स को COM और प्रतिबिंब के माध्यम से .NET कार्यक्षमता तक पहुंचने की अनुमति देता है। हालांकि यह पुराना है, यह एक आकर्षण की तरह काम करता है क्योंकि यह COM का उपयोग करता है। मैं सत्यापित करूंगा कि यह .NET 2.0 और 3.5 के साथ काम करता है। मुझे .NET DLL को पूरी तरह से हमारे विरासत डेल्फी 5 एप्लिकेशन में एकीकृत किया गया है। मेरे मालिक ने सोचा कि मैं एक सुपरहीरो था। सौभाग्य!

    2

    आप डेल्फी का उपयोग नेट और अप्रबंधित निर्यात के लिए कर सकते हैं, जिसे रिवर्स पी/इनवोक भी कहा जाता है।

    यह अनिवार्य रूप से आपको .Net .dll बनाने की सुविधा देता है जिसमें नेट फ्रेमवर्क की पूर्ण पहुंच है, लेकिन किसी भी मूल भाषा द्वारा लोड किया जा सकता है, जैसे कि आप किसी भी .dll के साथ, और कॉम इंटरऑप के ओवरहेड के बिना।

    यहाँ एक सरल उदाहरण है: http://cc.codegear.com/Item/22688

    4

    जेसीएल के साथ डेल्फी में सीएलआर की मेजबानी के अंत अंत के लिए my question देखें।

    संबंधित मुद्दे