SORU
7 Temmuz 2009, Salı


Nasıl yok C# derleyici COM türünü tespit eder?

DÜZENLEME:Sonuçlar blog post olarak yazdım.


C# derleyicisi COM türleri biraz sihirli bir şekilde davranır. Örneğin, bu ifade normal görünüyor...

Word.Application app = new Word.Application();

... Application anlasan kadar bir arabirim. Bir arabirim? bir kurucu çağırmak Yoiks! Bu aslında Type.GetTypeFromCLSID() Activator.CreateInstance başka bir telefon çevrilmiş olur.

Ayrıca, C# 4, ref parametrelerin non-ref değişkenleri kullanabilirsiniz, ve derleyici sadece yerel bir değişken referans geçmek, sonuçları atarak ekler:

// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");

(Evet, tartışmalar eksik bir sürü vardır. İsteğe bağlı parametreler güzel değil mi? :)

Derleyici davranışlarını araştırmak için çalışıyorum, ve sahte ilk bölümü başarısız oluyorum. Hiçbir sorun ile ikinci bölümü yapabilirim:

using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
    void Foo(ref int x);
}

class Test
{
    static void Main()
    {
        Dummy dummy = null;
        dummy.Foo(10);
    }
}

Yazmak istiyorum:

Dummy dummy = new Dummy();

gerçi. Açıkçası yürütülmesi sırasında patlama olacak, ama sorun değil. Sadece deniyorum.

Diğer öznitelikleri bağlı COM PIA için derleyici (CompilerGenerated TypeIdentifier) tarafından eklenen hile... sihirli sos nedir? gibi görünmüyor

CEVAP
7 Temmuz 2009, Salı


Hayır yani ben bir uzman değilim, ama son zamanlarda düşündüğüm şeyi üzerine tökezledi: CoClass öznitelik sınıfı.

[System.Runtime.InteropServices.CoClass(typeof(Test))]
public interface Dummy { }

Coclass malzemeleri beton uygulama(lar), bir veya daha fazla arayüzleri. COM, bu beton uygulamaları herhangi bir yazılabilir COM destekleyen programlama dili örneğin Delphi,bileşen geliştirme C , Visual Basic, vb.

Görebileceğin yerde my answer to a similar question about the Microsoft Speech API, "başlatılamadı" arabirimi SpVoice (ama gerçekten, SPVoiceClass başlatmasını sen).

[CoClass(typeof(SpVoiceClass))]
public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event { }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • OVERWERK

    OVERWERK

    6 Temmuz 2010
  • paikimchung

    paikimchung

    12 Mayıs 2006