www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]? 我們知道C#開發(fā)效率是非常高的,特別是做一些漂亮的頁面就更適合用它了啊.如果你開發(fā)一個桌面應(yīng)用程序即想性能好點又想頁面漂亮點可以考慮用C++和C#一起用.反正現(xiàn)在Win7都集成NetFramewo

? 我們知道C#開發(fā)效率是非常高的,特別是做一些漂亮的頁面就更適合用它了啊.如果你開發(fā)一個桌面應(yīng)用程序即想性能好點又想頁面漂亮點可以考慮用C++和C#一起用.反正現(xiàn)在Win7都集成NetFramework了,就不用糾結(jié)為了裝個C#的應(yīng)用程序而去再整個NetFramework裝上.可以用C#做成com組件,然后C++去調(diào)用.反過來也行.可以C++做成com,然后C#來調(diào)用.

下面我舉個簡單的小例子.我用的是VS 2008,操作系統(tǒng)是Win 7.

? 首先創(chuàng)建一個C# com組件.實現(xiàn)的功能很簡單,就是返回兩數(shù)相加的和.

?

1.新建一個C# Project,類型就選Class Library.取名ArwenAddCom

2.在項目中添加一個接口,取名IComTest.C++調(diào)用com組件中所有的功能只能通過接口來調(diào)用,不能直接調(diào)用類或函數(shù)

具體代碼:

using System.Runtime.InteropServices; //記得加這個命名空間

namespace ArwenAddCom

{

????[Guid("DA07B88D-29F0-41cf-B3D3-611010E6F3FF")]?// guid的產(chǎn)生可以通過vs自帶的工具.點菜單欄上的Tools ->Create GUID,然后選第4個選項.Registry Format.

??????????//點按鈕New GUID,再點Copy.這樣你就可以把產(chǎn)生的guid復(fù)制下來,然后粘貼到這個地方來.當(dāng)然那個大括號得去掉.后面需要用到guid的地方也用這方式產(chǎn)生

??? [ComVisible(true)]

????public interface IComTest????????//記得用修飾符public

??? {

????????[DispId(1)]?????? //如果還要添加其他函數(shù)就繼續(xù)來個[DispId(2)],[DispId(3)]加在函數(shù)前面

????????int Plus(int one,?int two);

??? }

}

?

3.添加一個類ComTest,繼承接口IComTest,具體代碼

using System.Runtime.InteropServices;

namespace ArwenAddCom

{

????[Guid("04F4DC83-8883-4a03-BDBC-92D8630ECC1F")]

??? [ClassInterface(ClassInterfaceType.None)]

??? public class ComTest : IComTest

??? {

??????? public?int Plus(int a,?int b)

??????? {

??????????? return a + b ;

??????? }

??? }

}

?

4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)].右擊項目名打開屬性窗口,點標(biāo)簽Build,選中Register for COMinterop.

?

如果不想把生成的dll共享,把它放到GAC中的程序集里.工作到此完成.點擊build,在bin目錄中會找到一個ArwenAddCom.dll文件.這個文件就是我們需要的com組件了.另外還會看到一個文件ArwenAddCom.tlb,正常情況應(yīng)該有的.如果萬一沒這個tlb文件也可以后面通過一些命令調(diào)用dll文件去生成它.反正C++調(diào)用時dll,tlb文件是不能少的.

如果想把dll放到GAC中則還要做第五步后再build

?

5.生成snk文件,并添加到項目中(可選的步驟)

?

先打開VS命令窗口,有點像用cmd打開的dos窗口.在開始簡單找到vs 2008,在visual studio tools下面有個Visual studio commandprompt.點擊打開它

默認(rèn)顯示c:windowssystem32.你可以先切換到其他窗口.比如輸入D:再回車就切換到D盤的路徑下了再輸入cd D:temp切換到temp目錄.cd加任何路徑就可以切換到d盤任何地方

然后輸入命令sn–k ArwenAddCom.snk?再回車,就會在temp目錄下生成一個snk文件.把ArwenAddCom.snk拷貝到項目的根目錄中.和csproj文件相同的目錄.

打開項目屬性窗口,點標(biāo)簽Signing,選中Sign the assembly.并在下面的下拉列表中點browse,然后彈出一個對話框來,選中ArwenAddCom.snk

再次點build生成dll文件.

?

C++調(diào)用 C# com組件

?

1.調(diào)用前要先把com組件注冊才行.

如果你剛調(diào)用dll和則build生成dll是在同一臺電腦上則不用注冊了.因為build C#的工程時選了Register for COMinterop.就自動給你注冊了

如果不在同一臺電腦上,那就要另外去注冊,要真正開發(fā)桌面開發(fā)程序人家拿個安裝程序去用時自然要重新注冊的.這種情況下肯定不能手動注冊,是通過寫代碼. 這里為了簡單起見就只講下怎么手動注冊

跟生成snk文件一樣要用到vs命令窗口.如果是沒有用到snk文件的dll注冊.先在vs命令窗口中把路徑切換到開始生成的dll所在的目錄.dll隨便放哪都一樣,只要找到那目錄就行.

如果是是使用了snk文件,則通過gacutil /i ArwenAddCom.dll 將dll放入GAC中

再通過REGASM ArwenAddCom.dll? /tlb:ArwenAddCom.tlb即可注冊dll并生成tlb文件.

補充:

如果已經(jīng)有tlb文件只注冊的話就是REGASM ArwenAddCom.dll,??????????? 如果是單獨想生成tlb文件是tlbexp /out:ArwenAddCom.tlb? ArwenAddCom.dll.

另外還可以通過REGASM /regfile:ArwenAddCom.reg ArwenAddCom.dll生成一個reg注冊腳本文件,你可以雙擊這個腳本文件去注冊.

?

2.注冊完了就可以在代碼中用了,先新建一個C++ project,類型選Win32 Console Application

project名字取UseCsharpCom,在向?qū)ы撁纥cfinish.把ArwenAddCom.tlb文件拷貝到項目的任何目錄下.我就放在D:UseCsharpComUseCsharpCom.我們會看到一個UseCsharpCom.cpp文件,雙擊打開把默認(rèn)生成的代碼全部刪掉.敲入下面代碼:

#include "stdafx.h"

#include

#import "..UseCsharpComCsharpComTest.tlb" named_guids raw_interfaces_only

void _tmain(int argc, _TCHAR* argv[])

{

????CoInitialize(NULL);

?? CsharpComTest::IComTestPtr ptr;?????? //類似明志一個指向接口的指針

???ptr.CreateInstance(CsharpComTest::CLSID_ComTest);??? //實例化一個類

?? //這個地方有一點點奇怪我也還沒弄懂.在C#中的函數(shù)是int Plus(int,int).但類型在這里都轉(zhuǎn)成long了.另外就是我們不能直接

? //來個long a = ptr->Plus(1,2);這樣得不到a = 3,反正會出錯.這里函數(shù)Plus的參數(shù)變成三個了long Plus(long,long,long *).其中最后一個指針得兩數(shù)相加的結(jié)果

???long a = 1;

?? long * lPtr = &a;

??? ptr->Plus(1,2,lPtr);

??? std::cout<<a;

}

如果前面把dll放到GAC中,此時就可以正確運行了.得到結(jié)果3

如果沒有把dll放到GAC中,則必須把dll文件拷貝到有UseCsharpCom.exe這個文件的目錄下.

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉