2010-03-01 77 views
3

我使用Unmanaged Exports從.NET .dll創建一個本地.dll,這樣我就可以在沒有COM註冊的情況下從Delphi訪問.NET代碼。FoxPro和.NET COM沒有註冊

例如,我有這樣的.NET程序集:

using System; 
using System.Collections.Generic; 
using System.Text; 
using RGiesecke.DllExport; 
using System.Runtime.InteropServices; 

namespace DelphiNET 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31")] 
    public interface IDotNetAdder 
    { 
     int Add3(int left); 
    } 

    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class DotNetAdder : DelphiNET.IDotNetAdder 
    { 
     public int Add3(int left) 
     { 
     return left + 3; 
     } 
    } 

    internal static class UnmanagedExports 
    { 
     [DllExport("createdotnetadder", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)] 
     static void CreateDotNetAdderInstance([MarshalAs(UnmanagedType.Interface)]out IDotNetAdder instance) 
     { 
     instance = new DotNetAdder(); 
     } 
    } 
} 

當我定義在Delphi相同的接口,我可以很容易地使用.NET對象:

type 
    IDotNetAdder = interface 
    ['{ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31}'] 
    function Add3(left : Integer) : Integer; safecall; 
    end; 

procedure CreateDotNetAdder(out instance : IDotNetAdder); stdcall; 
    external 'DelphiNET' name 'createdotnetadder'; 

var 
    adder : IDotNetAdder; 
begin 
    try 
    CreateDotNetAdder(adder); 
    Writeln('4 + 3 = ', adder.Add3(4)); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

見我Delphi question and answers的細節。

我的問題:
在FoxPro中是這樣的可能嗎?我已經試過這失敗數據類型不匹配錯誤就行createdotnetadder(@ldnw)如下:

DECLARE createdotnetadder IN DelphiNET.dll object @ ldnw 
ldnw = 0 
createdotnetadder(@ldnw) 
loObject = SYS(3096, ldnw) 
? loObject.Add3(4) 

我可以在FoxPro中定義的界面同樣地,我是如何做到的德爾福?如果沒有,我可以從FoxPro使用這個.dll嗎?我使用Visual FoxPro 9.0 SP2。謝謝。

+0

Rick Strahl在VFP COM Interop上有一篇很好的文章:http://www.west-wind.com/presentations/VfpDotNetInterop/DotNetFromVFP.asp – 2010-03-01 21:43:00

+0

@Brian:我知道Rick的頁面。我想避免COM註冊,但它似乎不可能在FoxPro中。 – 2010-03-02 14:19:43

回答

1

看來,最簡單的方法是與COM註冊生活。另一種方法是手動託管CLR。裏克施特拉爾對如何做到這一點從FoxPro廣泛的職位:

http://www.west-wind.com/wconnect/weblog/ShowEntry.blog?id=631

+0

不幸的是,CLR託管不適合我。 .NET代碼使用線程,並在退出foxpro應用程序時遇到Loader Lock異常。 – 2010-03-03 22:33:14

+0

那麼你可能想把CLR託管出來。你在你的Q中提到你得到了Delphi/UnmangedExports的工作 - 是運行中還是處理中? – 2010-03-04 14:32:11

+0

德爾福正在進行中,但你必須調整浮點異常處理。無論如何,我已經轉移到COM - 這很容易,但我擔心最終用戶計算機上的註冊問題。 – 2010-04-05 12:33:45

0

您也可以使用開源wwDotnetBridge project它會自動託管程序的CLR運行時爲你提供其他支持功能,使主機它更容易在FoxPro中使用.NET類型和結構。

loBridge = CREATEOBJECT("wwDotnetBridge","V4") 
loBridge.LoadAssembly("MyAssembly.dll") 
loInstance = loBridge.CreateInstance("MyNamespace.MyClass") 

loInstance.DoSomething(parm1) 
loBridge.InvokeMethod(loInstance,"SomeOtherMethodWithUnsupportedTypeParms",int(10)) 

wwDotnetBridge處理對象的創建,爲您和回傳COM實例,就像本地COM互操作的做法,但它通過COM互操作,否則提供額外的功能不可訪問:

  • 訪問靜態方法和成員
  • 訪問值類型
  • 支持更新數組和集合
  • 支持重載的方法和構造函數
  • 訪問泛型類型

和許多幫手,讓你解決在COM的侷限性 - > NET映射提供。