国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#調(diào)用COM接口的三種方式

這篇具有很好參考價(jià)值的文章主要介紹了C#調(diào)用COM接口的三種方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.準(zhǔn)備工作

使用OLEView.exe查看本機(jī)安裝的COM組件CLSID和接口Guid

??COM組件的提供者沒(méi)有提供CLSID等信息或信息提供不全時(shí),可以使用OleView.exe來(lái)查看其類(lèi)和接口的GUID. OLEView.exe全稱(chēng)是OLE-COM Object Viewer,是Microsoft SDK中包含的一個(gè)工具,可以用來(lái)查看本機(jī)安裝的所有COM組件的信息,包括CLSID、ProgID等。如果是完整的開(kāi)發(fā)環(huán)境,其位置在C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin,非開(kāi)發(fā)環(huán)境下也可以到網(wǎng)上下載該程序和它依賴(lài)的一個(gè)IVIEWERS.DLL.
??在All Objets中查看COM組件的CLSID,右鍵可以直接復(fù)制CLSID. 右鍵選中項(xiàng),點(diǎn)擊ViewTypeInfo可查看詳細(xì)接口列表和接口的Guid。本次使用的COM組件只有一個(gè)callJson接口,一個(gè)字符串類(lèi)型的輸入?yún)?shù)([in]),一個(gè)輸出參數(shù)作為返回值([out,retval])。

2.三種不同的引用方式

方式1 使用tlbimp生成類(lèi)庫(kù)直接引用

常見(jiàn)的COM組件是dll形式,在VS中可以直接添加引用,VS會(huì)自動(dòng)生成一個(gè)Interop.xxx.dll類(lèi)庫(kù)。項(xiàng)目中使用的第三方COM組件是exe形式,可以使用tlbimp.exe手動(dòng)轉(zhuǎn)換。在Visual Studio的工具庫(kù)中找到并打開(kāi)VS的命令提示符,按格式輸入指令tlbimp FILENAME /out:OUTPUT生成類(lèi)庫(kù),類(lèi)庫(kù)生成之后就可以在VS中添加引用,然后像其他類(lèi)庫(kù)一樣直接調(diào)用其中的接口。

方式2 使用CLSID和反射動(dòng)態(tài)調(diào)用

已知COM類(lèi)的CLISID時(shí)可以直接使用Type.GetTypeFromCLSID方法來(lái)獲取COM組件的Type,然后動(dòng)態(tài)創(chuàng)建對(duì)象調(diào)用接口。

private string CallJson(string input)
        {
            string ret = "";
            Type dycomType = Type.GetTypeFromCLSID(new Guid("xxxxxx"));

            if (dycomType != null)
            {
                //創(chuàng)建類(lèi)實(shí)例
                dynamic dycomObject = Activator.CreateInstance(dycomType);
                //調(diào)用
                ret = dycomObject?.callJson(input);
            }

            return ret;
        }

也可以使用ProgId來(lái)獲取:

Type t = Type.GetTypeFromProgID("TestComServer.TestComVisibleClass");
dynamic o = Activator.CreateInstance(t);

方式3 ComImport方式引用

使用ComImport標(biāo)簽引用COM組件,需要寫(xiě)明類(lèi)的Guid和接口的Guid:

    [ComImport, Guid("xxxxxxxxxxxx")]
    class DycomObject
    {

    }
    // Declare IMediaControl as a COM interface which 
    // derives from the IDispatch interface. 
    [Guid("xxxxxxxx"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    interface IDycomObject // cannot list any base interfaces here 
    {
        // Note that the members of IUnknown and Interface are NOT
        // listed here 
        //
        [return: MarshalAs(UnmanagedType.BStr)]
        object callJson(
        [In, MarshalAs(UnmanagedType.BStr)] string request);

    }

調(diào)用:?

?

      private string CallJson(string input)
        {
            string ret = "";
            Console.WriteLine("創(chuàng)建類(lèi)實(shí)例");
            DycomObject dy = new DycomObject();
            IDycomObject iDy = (IDycomObject)dy;
            Console.WriteLine("調(diào)用");
            ret = (string)iDy.callJson(input);
            return ret;
        }

實(shí)際項(xiàng)目中的問(wèn)題

??上述三種方式的接口格式都是一個(gè)輸入?yún)?shù)對(duì)應(yīng)COM接口的[in]參數(shù),一個(gè)返回值對(duì)應(yīng)[out,retval]參數(shù),按照第三方接口描述,返回值中包含接口調(diào)用結(jié)果和錯(cuò)誤碼。實(shí)際使用中發(fā)現(xiàn),調(diào)用出錯(cuò)時(shí),接口會(huì)返回一個(gè)非零的HRESULT,同時(shí)把錯(cuò)誤信息傳給[out,retval]參數(shù),但.Net會(huì)把非零的HRESULT轉(zhuǎn)換為一個(gè)異常拋出,導(dǎo)致以上三種寫(xiě)法的返回值都為null,無(wú)法獲取錯(cuò)誤信息。在社區(qū)發(fā)帖問(wèn)到了解決方法,就是需要修改方式3的引用方式,使用[PreserveSig]取消COM互操作期間的HRESULT和retval簽名轉(zhuǎn)換,讓錯(cuò)誤信息可以被正常接收到:

[ComImport, Guid("xxxxxx")]
    class DycomObject
    {

    }
    [ComVisible(true), ComImport, Guid("xxxxxx")]
    interface IDycomObject
    {
        [PreserveSig]
        int callJson(
            [In,MarshalAs(UnmanagedType.BStr)]
            string request, 
            [Out,MarshalAs(UnmanagedType.BStr)]
            out string response);
    }

    private string CallJson(string input)
    {
        string ret = "";
        Console.WriteLine("創(chuàng)建類(lèi)實(shí)例");
        DycomObject dy = new DycomObject();
        IDycomObject iDy = (IDycomObject)dy;
        Console.WriteLine("調(diào)用");
        var code = iDy.callJson(input,out ret);
        return ret;
    }

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441068.html

到了這里,關(guān)于C#調(diào)用COM接口的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • AIGC: 關(guān)于ChatGPT中API接口調(diào)用相關(guān)準(zhǔn)備工作

    ChatGPT之API接口相關(guān) 通過(guò)頁(yè)面和GPT交流獲取信息相比直接調(diào)用GPT的API而言是非常有限的 頁(yè)面上的GPT是比較封閉的,而且只允許我們?nèi)ポ斎胛谋镜男畔?我們需要借助GPT的API開(kāi)發(fā)來(lái)激發(fā)AI工具的無(wú)限可能,實(shí)現(xiàn)更多個(gè)性化需求 1 ) 使用API 使用API有一個(gè)前置的條件 注冊(cè)ChatGPT賬號(hào)

    2024年02月04日
    瀏覽(57)
  • C#使用post方式調(diào)用接口獲取Token及調(diào)用網(wǎng)頁(yè)地址

    ?IP、Port表示地址及端口,可配置或?qū)懰?public string PostDate(string IP,string Port) ? ? ? ? { ? ? ? ? ? ? //設(shè)置參數(shù) ? ? ? ? ? ? string content= \\\"{\\\"userName\\\":\\\"\\\" 0000 \\\"\\\"\\\" + ? ? ? ? ? ? ? ? ?\\\",\\\"password\\\":\\\"123456\\\"}\\\"; ? ? ? ? ? ? //填充路徑 ? ? ? ? ? ? string strUrl = string.Format(\\\"http://{0}:

    2023年04月08日
    瀏覽(25)
  • python調(diào)用父類(lèi)方法的三種方式(super調(diào)用和父類(lèi)名調(diào)用)

    父類(lèi)名.方法名(self) super(子類(lèi)名,self).父類(lèi)方法名() super().父類(lèi)方法名 注意:super()通過(guò)子類(lèi)調(diào)用當(dāng)前父類(lèi)的方法,super默認(rèn)會(huì)調(diào)用第一個(gè)父類(lèi)的方法(適用于單繼承的多層繼承 如下代碼: 如下代碼: 上面代碼運(yùn)行結(jié)果: 針對(duì)這種情況,正確的做法是定義Person類(lèi)自己的構(gòu)造方法

    2024年02月06日
    瀏覽(21)
  • java對(duì)接第三方接口的三種方式

    在日常工作中,經(jīng)常需要跟第三方系統(tǒng)對(duì)接,我們做為客戶(hù)端,調(diào)用他們的接口進(jìn)行業(yè)務(wù)處理,常用的幾種調(diào)用方式有: 1.原生的Java.net.HttpURLConnection(jdk); 2.再次封裝的HttpClient、CloseableHttpClient(Apache); 3.Spring提供的RestTemplate; 當(dāng)然還有其他工具類(lèi)進(jìn)行封裝的接口,比

    2024年04月28日
    瀏覽(26)
  • spring boot請(qǐng)求http接口的三種方式

    HttpURLConnection 是 Java 中的 HTTP 客戶(hù)端實(shí)現(xiàn),,適用于簡(jiǎn)單的請(qǐng)求需要。 HttpURLConnection主要工作內(nèi)容:打開(kāi)socket連接,封裝http請(qǐng)求報(bào)文,解析請(qǐng)求報(bào)文。 OkHttp 是一個(gè)第三方的 HTTP 客戶(hù)端庫(kù),它比 Java 標(biāo)準(zhǔn)的 HttpURLConnection 更高效、更實(shí)用。主要特點(diǎn)包括: 比 HttpURLConnection 快得多

    2024年02月14日
    瀏覽(28)
  • 【接口/性能測(cè)試】Jmeter引用 jar包的三種方式(詳細(xì))

    【接口/性能測(cè)試】Jmeter引用 jar包的三種方式(詳細(xì))

    實(shí)現(xiàn)對(duì)登錄密碼進(jìn)行MD5加密 pom文件依賴(lài) MD5Util類(lèi) package打包生成jar文件。 方式一:把jar包加入到classpath 添加jar包 login請(qǐng)求 beanshell腳本 發(fā)送請(qǐng)求后,從查看結(jié)果樹(shù)中可以看到請(qǐng)求的密碼加密了 方式二:把jar包放到lib/ext下 jmeter會(huì)自動(dòng)從它的/lib和/lib/ext目錄下的jar包中查找需要

    2024年02月15日
    瀏覽(21)
  • 【接口測(cè)試】POST請(qǐng)求提交數(shù)據(jù)的三種方式及Postman實(shí)現(xiàn)

    【接口測(cè)試】POST請(qǐng)求提交數(shù)據(jù)的三種方式及Postman實(shí)現(xiàn)

    ? POST請(qǐng)求是HTPP協(xié)議中一種常用的請(qǐng)求方法,它的使用場(chǎng)景是向客戶(hù)端向服務(wù)器提交數(shù)據(jù),比如登錄、注冊(cè)、添加等場(chǎng)景。另一種常用的請(qǐng)求方法是GET,它的使用場(chǎng)景是向服務(wù)器獲取數(shù)據(jù)。 當(dāng)前,POST請(qǐng)求提交數(shù)據(jù)的編碼方式有三種: application/x-www-form-urlencoded multipart/form-dat

    2024年02月10日
    瀏覽(33)
  • C#藍(lán)牙連接及傳輸數(shù)據(jù)的三種方式(藍(lán)牙傳輸文件、二進(jìn)制數(shù)據(jù))

    C#藍(lán)牙連接及傳輸數(shù)據(jù)的三種方式(藍(lán)牙傳輸文件、二進(jìn)制數(shù)據(jù))

    ? ? ? 先下載InTheHand.Net.Personal.dll并在C#中引用,這個(gè)需要在網(wǎng)上下載 ? ? ?先看界面 ? ? ? ? ? ?這種方式優(yōu)點(diǎn)是穩(wěn)定性較強(qiáng),基本無(wú)錯(cuò)誤,就是偶爾需要提前藍(lán)牙配對(duì)。 ? ? ? ?這種方式直接與藍(lán)牙設(shè)備進(jìn)行配對(duì)的時(shí)候會(huì)報(bào)錯(cuò),請(qǐng)求的地址無(wú)效,這時(shí)候需要在被檢測(cè)的藍(lán)牙

    2024年02月11日
    瀏覽(31)
  • uni-app中調(diào)取接口的三種方式與封裝uni.request()

    1、uni.request({}) 2、uni.request({}).then() 3、async/await 1、創(chuàng)建一個(gè)對(duì)象,將該對(duì)象掛在Vue的原型下 新建 @/common/request.js 文件 初步寫(xiě)法(僅供參考): 二次更改: 2、進(jìn)入main.js文件 例:在任意文件中書(shū)寫(xiě)下列代碼可以調(diào)用。 this.$Z.get(); 3、在頁(yè)面中調(diào)用 uniapp的網(wǎng)絡(luò)請(qǐng)求方法 CODE u

    2024年02月09日
    瀏覽(23)
  • 7. 【可編程并行接口8255】:接口特點(diǎn)、結(jié)構(gòu)、引腳、三種工作方式、控制字、方式0應(yīng)用、設(shè)計(jì)簡(jiǎn)易安全報(bào)警系統(tǒng)

    7. 【可編程并行接口8255】:接口特點(diǎn)、結(jié)構(gòu)、引腳、三種工作方式、控制字、方式0應(yīng)用、設(shè)計(jì)簡(jiǎn)易安全報(bào)警系統(tǒng)

    基本輸入/輸出方式 (方式0) 選通工作方式 (方式1) 雙向傳送方式 (方式2) 相當(dāng)于三個(gè)獨(dú)立的8位簡(jiǎn)單接口,可輸入或輸出 各端口既可設(shè)置為輸入口,也可設(shè)置為輸出口,但不能同時(shí)實(shí)現(xiàn)輸入及輸出 C端口可以是一個(gè)8位的簡(jiǎn)單接口,也可以分為兩個(gè)獨(dú)立的4位端口 常用于

    2024年02月06日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包