2010-03-01 3 views
3

을 사용하여 .NET .dll에서 기본 .dll을 만들면 COM 등록없이 Delphi에서 .NET 코드에 액세스 할 수 있습니다.등록하지 않고 FoxPro 및 .NET COM

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를 참조하십시오 : 델파이에서 동일한 인터페이스를 정의 할 때

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(); 
     } 
    } 
} 

, 나는 쉽게 .NET 객체를 사용할 수 있습니다

예를 들어 나는이 .NET 어셈블리를 .

내 질문 :
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 –

+0

@Brian : Rick의 페이지에 대해 알고 있습니다. 나는 COM 등록을 피하고 싶었지만 FoxPro에서는 불가능한 것 같습니다. –

답변

1

가장 간단한 방법은 COM 등록을 사용하는 것입니다. 다른 방법은 수동으로 CLR을 호스팅하는 것입니다. 당신을 위해 프로세스를 호스팅하는 CLR 런타임을 자동화 할 다른 지원 기능의 호스트를 제공하는 오픈 소스 wwDotnetBridge project

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

+0

불행히도 CLR 호스팅은 저에게 적합하지 않습니다. intesively 스레드를 사용하여 .NET 코드 및 foxpro 응용 프로그램을 종료 할 때 로더 잠금 예외가 있어요. –

+0

그러면 CLR을 처리하지 못하게하고 싶을 것입니다. Q에서 델파이/UnmangedExports가 작동 중이라는 사실을 언급 했습니까 - 실행중인 프로세스 또는 프로세스 외부입니까? –

+0

Delphi가 진행 중이었지만 부동 소수점 예외 처리를 조정해야했습니다. 어쨌든, 필자는 COM으로 옮겼습니다. 최종 사용자 컴퓨터에서 등록 문제가 두렵다하더라도 더 쉽습니다. –

0

또한 사용할 수 있습니다 릭 Strahl는 FoxPro에에서이 작업을 수행 할 방법에 대한 광범위한 포스트가 있습니다 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 Interop를 통해 다른 접근 추가 기능을하지 제공 : 정적 메서드와 멤버에

  • 액세스 값 유형에
  • 액세스 배열과 컬렉션을 업데이트
  • 지원 오버로드 된 메서드와 생성자에 대한
  • 지원 일반적인 유형

많은 헬퍼

  • 액세스를 사용하면 COM의 한계를 극복 할 수 있습니다 -.> NET 매핑을 제공했다.

  • 관련 문제