全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7352
推到 Plurk!
推到 Facebook!

有沒有人曾經使用過delphi 去call .net c#寫的.dll??

答題得分者是:sryang
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-28 15:23:58 IP:61.220.xxx.xxx 未訂閱
狀況是這個樣子的,因為專案的需求必需讓.net與delphi溝通, 目前delphi寫的dll在.net已可以正常運作,但是.net上用c#寫 的.dll我沒辦法使用,不知道各位有沒有遇過類似的問題題?? 如果不限制是c#有沒有人曾經去用過.net的dll ps:不是unicode和ascii的問題我想,因為.net已可使用delphi 的.dll了
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-01 10:26:41 IP:61.220.xxx.xxx 未訂閱
我想或許是我之前的問題講不清楚,在此補充說明, 我的delphi版本是5,不過我試過7的也不行,用, stdcall及cdecl兩個方法我也都試過了,它compiler會出現 "應用程式出始值(0xc000007b)失敗"然後就是出現 "access violation at 0x77f83941: write of address 0x00000010" process stop. 用上面兩個版本,怎麼run都是出現這個該死的訊息耶, 我是不是漏了什麼沒做呀?? 請大家關心一下喔,謝謝,就算不確定給我個方向也可以,我 會自己去try的..
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-01 13:50:16 IP:61.57.xxx.xxx 未訂閱
引言: 我想或許是我之前的問題講不清楚,在此補充說明, 我的delphi版本是5,不過我試過7的也不行,用, stdcall及cdecl兩個方法我也都試過了,它compiler會出現 "應用程式出始值(0xc000007b)失敗"然後就是出現 "access violation at 0x77f83941: write of address 0x00000010" process stop. 用上面兩個版本,怎麼run都是出現這個該死的訊息耶, 我是不是漏了什麼沒做呀?? 請大家關心一下喔,謝謝,就算不確定給我個方向也可以,我 會自己去try的..
.Net 的 DLL 雖然附檔名是「.dll」,但是有很大的不同 他裡面的內容是 MSIL 的 code,要執行的時候必須由 .Net Framework 載入,並經由 JIT compiler (Just in time) 編譯成 machine code 才能執行 不可能直接讓 Delphi 當作 COM 一樣來用的 至於 .Net 能使用之前已經開發好的 COM,則是因為 .Net 有 InterOp 機制 可以去呼叫舊有的 COM 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-01 16:35:17 IP:61.220.xxx.xxx 未訂閱
謝謝你的答案,那我可不可以再請教一下,如果 1.我直接用c#寫成com是不是就可以解了呢?? <-- 這個我會試 2.那是不是c# 寫的dll在delphi裡就一定不能執行囉?? 還是我可以乎叫什麼外部的指令,來編譯執行呢?? 還是有沒有其它的解法?如果可以的話,麻煩在指點我一下, 謝謝!
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-01 22:17:05 IP:61.64.xxx.xxx 未訂閱
引言: 謝謝你的答案,那我可不可以再請教一下,如果 1.我直接用c#寫成com是不是就可以解了呢?? <-- 這個我會試 2.那是不是c# 寫的dll在delphi裡就一定不能執行囉?? 還是我可以乎叫什麼外部的指令,來編譯執行呢?? 還是有沒有其它的解法?如果可以的話,麻煩在指點我一下, 謝謝!
據我所知,C# 不能寫 COM,如果要呼叫 C# 的東西,可能只有 Web Service 一途了 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
jimmy_wei
高階會員


發表:9
回覆:176
積分:147
註冊:2003-08-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-03 18:20:49 IP:61.220.xxx.xxx 未訂閱
提供大家一個用COM解的方法,但是還是希望有人可以提供我.DLL的方法    

基本上想直接乎叫.NET的DLL或是COM是不可能的,因為.NET在執行COM元件時是透過CRL(Common Runtime Language)來運作,所以必須在中間建立一層COM callable wrapper (CCW)當作之間呼叫的介面,也因如此才會有以下的解法。

注意,要執行以下的指令必需有FrameWork才可以執行 在DOS命令模式下:

1.Create a strong name key:建立註冊碼sn –k C:\TESTWEB.snk

2.產生tlbexp(type library exporter),讓COM Component可以使用.NET Component的properties, methods, and events
tlbexp C:\TESTWEB.dll /out: C:\TESTWEB.tlb <--TESTWEB.DLL 是我想要直接呼叫的DLL

3.必需在系統管理工具\元件服務 加上C:\TESTWEB.tlb 這個COM元件

4.Register the Assembly and Create a Type Library:
利用.NET Framework SDK的Assembly Registration Tool(regasm)工具
to create the type library and register。
Regasm /tlb: C:\TESTWEB.tlb C:\TESTWEB.dll

5.Add the Assembly to the Gobal Assembly Cache:
將.NET assembly安裝在Gobal Assembly Cache(GAC),變成能提供分享的assembly
gacutil /i C:\ITRIWEB.dll

6.這是DELPHI的範例
uses comobj;
procedure TForm1.Button2Click(Sender: TObject);
var aa:Integer;
Myitriweb: VariaNT;
begin
Myitriweb:=CreateOLEObject('ITRIWEB.ITRIWEB');
try
aa:=connectServer(StringToWideString(WebService.Text,0),
StringToWideString(ODBC.Text,0),
StringToWideString(UserName.Text,0),
StringToWideString(PWD.Text,0));
finally
// MyItriweb
end;
ConnectStatus.Text:=IntToStr(aa); ShowMessage('測試完畢');
end;

7.大功告成,有興趣的人可以試試
編輯記錄
GrandRURU 重新編輯於 2016-08-05 09:18:34, 註解 無‧
che1983
一般會員


發表:4
回覆:1
積分:1
註冊:2004-11-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-25 13:54:58 IP:61.216.xxx.xxx 未訂閱
請問有沒有BCB的語法範例...因為我看不懂DELPHI...>< 謝謝!!
系統時間:2024-04-24 22:41:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!