2012-07-27 67 views
2

我想知道如何從我自己的C#DLL創建COM對象。從自己的C#DLL創建COM對象4GL

我在C#中做了如下分類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ProgressNet 
{ 
    [Guid("a9b1e34d-3ea3-4e91-a77a-5bcb25875485")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ComVisible(true)] 
    [ProgId("ProgressNet.Server")] 
    public class NetServer 
    { 
     public NetServer() {} 

     [DispId(1)] 
     public string GetString() 
     { 
      return "Some String"; 
     } 
    } 
} 

在屬性中我檢查註冊爲COM互操作。

然後我用regasm註冊了DLL。

regasm G:\ProgressTestApp\ProgressNet.dll /tlb:G:\ProgressTestApp\ProgressNet.tlb /codebase 

然後,我在進步4GL嘗試這種代碼:

DEFINE VARIABLE NetServer AS COM-HANDLE. 
CREATE "ProgressNet.NetServer" NetServer. 
MESSAGE NetServer:GetString(). 

但後來我得到 「爲ProgressNet.NetServer自動化服務器未正確註冊」 ..

有什麼建議? :)

+0

錯誤消息非常明確。你如何使用regasm的描述不是。 – 2012-07-27 12:49:43

+0

regasm G:\ ProgressTestApp \ ProgressNet.dll /tlb:G:\ProgressTestApp\ProgressNet.tlb – RaphaelH 2012-07-27 14:13:48

+0

添加/ codebase選項,因此您不必將程序集放入GAC。 – 2012-07-27 16:17:19

回答

1

如果有人仍在閱讀本文,答案會非常簡單:下面一行是錯誤的。

MESSAGE NetServer::GetString(). 

應該

MESSAGE NetServer:GetString(). 
1

的錯誤是在create COM手柄聲明。它應該是create "ProgressNet.Server" NetServer.,而不是ProgId調用所指定的"ProgressNet.NetServer"

我註冊了與你所提到的regasm的DLL,並使用下面的代碼來測試,它工作正常。

def var ch as com-handle no-undo. 

create "ProgressNet.Server" ch. 

MESSAGE ch:GetString() 
    VIEW-AS ALERT-BOX INFO BUTTONS OK.