第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

是否有更簡(jiǎn)潔的方法來(lái)使 COM 可見(jiàn)應(yīng)用程序?

是否有更簡(jiǎn)潔的方法來(lái)使 COM 可見(jiàn)應(yīng)用程序?

C#
拉丁的傳說(shuō) 2021-11-07 19:15:14
給定一個(gè)特定的類(lèi):public class Klass{    public int value;    public void doSomething(){        return;    }}為了使所述類(lèi) COM 可見(jiàn),據(jù)我所知,需要做幾件事:進(jìn)口 System.Runtime.InteropServices為類(lèi)創(chuàng)建一個(gè)接口。擴(kuò)展創(chuàng)建的接口。創(chuàng)建 2 個(gè)唯一的 GUID,一個(gè)用于接口,另一個(gè)用于類(lèi)。將調(diào)度 ID 添加到接口。生產(chǎn)類(lèi)似的東西:[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]public interface IKlass{    [DispId(0)]    public int value;    [DispId(1)]    public void doSomething();}[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),    ClassInterface(ClassInterfaceType.None)]public class Klass : IKlass{    public int value;    public void doSomething(){        return;    }}在我看來(lái),生成的代碼看起來(lái)非常惡心……問(wèn)題是,是否有一種更簡(jiǎn)單的方法來(lái)創(chuàng)建這些 COM 接口?我可以想象自己修改構(gòu)建過(guò)程以提供interop功能。例如public interop class Klass{    public interop int value;    //...}然而,這是非標(biāo)準(zhǔn)的,這也有它的問(wèn)題。是否有任何內(nèi)置到 Visual Studio/C# 的東西可以讓我更容易/更清晰地構(gòu)建 COM 接口?
查看完整描述

2 回答

?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

正如Zohar Peled所建議的,最好的方法是使用RegAsm.exe:


創(chuàng)建一些 C# 類(lèi)庫(kù)“TestProject”:

using System.Windows.Forms;

namespace TestProject

{

    // Note. Only public classes are exported to COM!

    public class Test

    {

        // Note. Only public methods are exported to COM!

        public void testIt() {

            MessageBox.Show("Yellow world");

        }

    }

}

重要提示:只有公共類(lèi)被導(dǎo)出到 COM。并且只有這些類(lèi)的公共方法可通過(guò) COM 對(duì)象實(shí)例使用。


簽署項(xiàng)目。


在 AssemblyInfo.cs 中設(shè)置[assembly: ComVisible(false)]為[assembly: ComVisible(true)]. 注意:您還可以在要向 COM 公開(kāi)的每個(gè)類(lèi)之前使用屬性 [ComVisible(true)]。這只是將默認(rèn)設(shè)置設(shè)置為true在構(gòu)建 API 時(shí)更容易使用


構(gòu)建項(xiàng)目。


運(yùn)行 regasm。請(qǐng)記住使用正確版本的 Regasm(32 位/64 位)和適用于您的 .NET 框架的版本:


# .NET v4.5 64-bit

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" -tlb -codebase "C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.dll" -verbose


# .NET v4.5 32-bit

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" -tlb -codebase "C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.dll" -verbose


...

Regasm 應(yīng)該輸出如下內(nèi)容:


Microsoft .NET Framework Assembly Registration Utility version 4.7.3056.0

for Microsoft .NET Framework version 4.7.3056.0

Copyright (C) Microsoft Corporation.  All rights reserved.


Types registered successfully

Type 'TestProject.Test' exported.

Assembly exported to 'C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.tlb', and the type library was registered successfully

現(xiàn)在您可以在 VBScript 中測(cè)試該文件,例如:


Dim o As Object

Set o = CreateObject("TestProject.Test")

Call o.testIt


查看完整回答
反對(duì) 回復(fù) 2021-11-07
?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

請(qǐng)注意,這會(huì)使您的項(xiàng)目中所有與 COM 兼容的類(lèi)也對(duì) COM 可見(jiàn),而您可能不希望出現(xiàn)這種情況(請(qǐng)參閱此處和此處)。如果您沒(méi)有明確設(shè)置 UUID,如果您使用 VB 或 VBA(不是 VBScript,后者是后期綁定的)等早期綁定客戶端訪問(wèn)類(lèi),那么您在部署時(shí)就會(huì)遇到問(wèn)題。


是的,它不是“干凈的”,但 COM 也不是,尤其是當(dāng)您想將它公開(kāi)給后期綁定客戶端實(shí)時(shí) VBScript 時(shí)。


我還將您的公共字段更改為屬性,這對(duì)公共成員來(lái)說(shuō)更標(biāo)準(zhǔn):


    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]

    public interface IKlass

    {

        [DispId(0)]

        public int value {get; set;}

        [DispId(1)]

        public void doSomething();

    }


查看完整回答
反對(duì) 回復(fù) 2021-11-07
  • 2 回答
  • 0 關(guān)注
  • 231 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)