[c#] كيف يكشف المحول البرمجي C # أنواع COM؟


Answers

بينك وبين مايكل كنت تقريبا حصلت على القطع مجتمعة. أعتقد أن هذا هو كيف يعمل. (لم أكتب الكود ، لذلك ربما أكون مخطئا قليلاً ، لكنني متأكد من أن هذه هي الطريقة التي تسير بها).

إذا:

  • أنت "جديد" جي نوع واجهة ، و
  • نوع الواجهة لديه coclass المعروفة و
  • أنت تستخدم ميزة "بدون pia" لهذه الواجهة

ثم يتم إنشاء التعليمات البرمجية باسم (IPIAINTERFACE) Activator.CreateInstance (Type.GetTypeFromClsid (GUID OF COCLASSTYPE))

إذا:

  • أنت "جديد" جي نوع واجهة ، و
  • نوع الواجهة لديه coclass المعروفة و
  • أنت لا تستخدم ميزة "no pia" لهذه الواجهة

ثم يتم إنشاء التعليمات البرمجية كما لو كنت قد قلت "COCLASSTYPE () جديد".

جون ، لا تتردد في حبيبي أو سام مباشرة إذا كان لديك أسئلة حول هذه الأشياء. لمعلوماتك ، سام هو الخبير في هذه الميزة.

Question

تعديل : لقد كتبت النتائج في مدونة .

يعامل برنامج التحويل البرمجي C # أنواع COM إلى حد ما بطريقة سحرية. على سبيل المثال ، تبدو هذه العبارة طبيعية ...

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

... حتى ندرك أن Application هو واجهة. استدعاء منشئ على واجهة؟ Yoiks! يتم بالفعل ترجمة هذا إلى استدعاء Type.GetTypeFromCLSID() وآخر إلى Activator.CreateInstance .

بالإضافة إلى ذلك ، في C # 4 ، يمكنك استخدام وسيطات غير ref لمعلمات ref ، ويضيف المحول البرمجي مجرد متغير محلي لتمريره كمرجع ، مع تجاهل النتائج:

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

(نعم ، هناك مجموعة من الحجج المفقودة. ليست معلمات اختيارية لطيفة؟ :)

أحاول التحقيق في سلوك المترجم ، وأخفق في تزوير الجزء الأول. يمكنني القيام بالجزء الثاني دون مشكلة:

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);
    }
}

أود أن أكون قادرًا على الكتابة:

Dummy dummy = new Dummy();

على أية حال. من الواضح أنها سوف تذهب ضجة في وقت التنفيذ ، ولكن هذا على ما يرام. أنا فقط أجرب

لا يبدو أن السمات الأخرى التي يضيفها المحول CompilerGenerated TypeIdentifier PIAs المرتبطة ( CompilerGenerated و TypeIdentifier ) تعمل الخدعة ... ما هي الصلصة السحرية؟




فقط لإضافة القليل من التأكيد إلى جواب مايكل:

التعليمة البرمجية التالية ترجمة وتشغيل:

public class Program
{
    public class Foo : IFoo
    {
    }

    [Guid("00000000-0000-0000-0000-000000000000")]
    [CoClass(typeof(Foo))]
    [ComImport]
    public interface IFoo
    {
    }

    static void Main(string[] args)
    {
        IFoo foo = new IFoo();
    }
}

أنت بحاجة إلى كل من ComImportAttribute و GuidAttribute حتى يعمل.

لاحظ أيضًا المعلومات عندما تحوم الماوس فوق new IFoo() : Intellisense تلتقط المعلومات بشكل صحيح: Nice!






Links