EDIT: Tôi đã viết kết quả dưới dạng blog post.Trình biên dịch C# phát hiện các kiểu COM như thế nào?
Trình biên dịch C# xử lý các loại COM hơi kỳ diệu. Ví dụ: tuyên bố này có vẻ bình thường ...
Word.Application app = new Word.Application();
... cho đến khi bạn nhận ra rằng Application
là một giao diện. Gọi một hàm tạo trên một giao diện? Yoiks! Điều này thực sự được dịch sang một cuộc gọi đến Type.GetTypeFromCLSID()
và một cuộc gọi khác đến Activator.CreateInstance
.
Thêm vào đó, trong C# 4, bạn có thể sử dụng lập luận phi ref cho ref
thông số, và trình biên dịch chỉ cần thêm một biến địa phương đi ngang qua tham khảo, loại bỏ các kết quả:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Yeah, có Không phải là tham số tùy chọn tốt đẹp? :)
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 giả mạo phần đầu tiên. Tôi có thể làm phần thứ hai với không có vấn đề:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00-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();
mặc dù. Rõ ràng là nó sẽ nổ tung tại thời điểm 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 thêm bởi trình biên dịch cho các COM PIA được liên kết (CompilerGenerated
và TypeIdentifier
) dường như không thực hiện các mẹo ... nước sốt ma thuật là gì?
Bạn đang đi trước tôi về công cụ này (hầu hết các công cụ), nhưng chỉ để clairification, nó có vẻ như những gì bạn đang sau là chức năng tiêm phụ thuộc với một cú pháp chuẩn hóa hơn - đó sẽ là chính xác? –
Thông số tùy chọn không đẹp? IMO, Không họ không đẹp. Microsoft đang cố sửa lỗ hổng trong các giao diện Office COM bằng cách thêm bloat vào C#. –
Câu hỏi hay (+1). Tôi đã nhận thấy điều tương tự về việc gọi một hàm tạo trên một giao diện. Nó trông khủng khiếp trong mã vì nó sẽ thực sự gây nhầm lẫn cho bất kỳ nhà phát triển không quen thuộc với những gì đang xảy ra. Tôi luôn tự hỏi điều gì đang diễn ra đằng sau hậu trường để làm cho nó hoạt động. Có vẻ như tôi sẽ mua sách mới của bạn ;-) –