EDIT: Tôi đã viết kết quả lên như một bài đăng trên blog .
Trình biên dịch C # xử lý các loại COM một cách kỳ diệu. Chẳng hạn, câu lệnh này có vẻ bình thường ...
Word.Application app = new Word.Application();
... Cho đến khi bạn nhận ra đó Application
là một giao diện. Gọi một nhà xây dựng trên một giao diện? Yoiks! Điều này thực sự được dịch thành một cuộc gọi đến Type.GetTypeFromCLSID()
và khác Activator.CreateInstance
.
Ngoài ra, trong C # 4, bạn có thể sử dụng các đối ref
số không tham chiếu cho các tham số và trình biên dịch chỉ cần thêm một biến cục bộ để chuyển qua tham chiếu, loại bỏ kết quả:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Vâng, có một loạt các đối số bị thiếu. Các tham số tùy chọn không đẹp sao? :)
Tôi đang cố gắng điều tra hành vi của trình biên dịch và tôi không thể giả mạo phần đầu tiên. Tôi có thể làm phần thứ hai mà không có vấn đề gì:
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);
}
}
Tôi muốn có thể viết:
Dummy dummy = new Dummy();
Tuy nhiên. Rõ ràng là nó sẽ nổ tung vào thời gian thực hiện, nhưng không sao. Tôi chỉ đang thử nghiệm.
Các thuộc tính khác được trình biên dịch thêm vào cho các PIA COM được liên kết ( CompilerGenerated
và TypeIdentifier
) dường như không thực hiện trò lừa ... nước sốt ma thuật là gì?
dynamic
... chúng tôi đã quá quen với việc gõ tĩnh / mạnh để xem tại sao nó lại quan trọng ngoài COM.