2014-07-11 14 views
6

Giao diện Microsoft.Office.Interop.Word._Document có một phương pháp với chữ ký sau đây:Hiểu COM C# giao diện

void Close(ref object SaveChanges = Type.Missing, ref object OriginalFormat = Type.Missing, ref object RouteDocument = Type.Missing); 

Một vài điểm tôi đang gặp khó khăn hiểu biết:

  1. Một ref tham số không thể có giá trị mặc định.
  2. Giá trị mặc định phải là một hằng số và Type.Missing thì không.
  3. Khi gọi phương thức này, tôi có thể sử dụng Close(false) - thông thường tham số ref yêu cầu biến có thể gán?
  4. Khi điều hướng đến định nghĩa Type trong Visual Studio, nó đưa tôi đến thuộc tính _Document.Type, nhưng điều này không có thuộc tính có tên Missing. Đây có phải là một lỗi trong VS?

Cảm ơn bạn đã giải thích.

+0

1. và 2 .: Thật đơn giản, thư viện interop không được viết bằng C# :), 3 .: Bạn cần một biến. 4: Nó sẽ đưa bạn đến 'System.Type.Missing' Tất cả trong tất cả, sử dụng VB.NET nếu bạn sẽ sử dụng thư viện COM như thế này - nó sẽ giúp bạn tiết kiệm một số lượng đáng kinh ngạc của rắc rối. VB là * ngôn ngữ * COM, sau khi tất cả. – Luaan

+0

@Luaan Tôi nghĩ rằng interop phải là hợp pháp C# - điều này có nghĩa là khi xem siêu dữ liệu trong VS từ một C# dll, nó không nhất thiết phải hợp lệ C#? _3 .: Bạn cần một biến._ - Tôi vừa tạo một dự án chuyển thành _false_ dưới dạng chữ, và nó hoạt động 100%. – wezten

+2

Đó là siêu dữ liệu. Nó phải là hợp lệ IL, nhưng không hợp lệ C# - một thực tế là VS dịch siêu dữ liệu cho bạn để IL chỉ là một vấn đề thuận tiện, nó không có nghĩa là nó đã được viết bằng C# ở nơi đầu tiên. Nếu nó phải làm, điều gì sẽ là điểm của việc có thêm nhiều ngôn ngữ trên CLR ngay từ đầu? Quảng cáo 3: Rất tiếc, tôi nghĩ tôi đã sử dụng điều đó trước khi thành công. Nó chỉ là tôi đã nhìn thấy quá nhiều SO Q & Vì luôn luôn sử dụng 'ref' đã có, xin lỗi :)) – Luaan

Trả lời

3

Đó là một điều không minh bạch, được giới thiệu trong C# phiên bản 4. Nó không phải là độc quyền cho mã interop COM, bạn cũng có thể nhận được nó trong mã của riêng bạn. Hãy thử điều này:

using System; 
using System.Runtime.InteropServices; 

class Program { 
    static void Example([Optional] object arg) { } 
    static void Main(string[] args) { 
     Example( // <== Look at the IntelliSense popup here 
    } 
} 

Thuộc tính [Tùy chọn] kích hoạt hành vi này. Đã được khoảng mãi mãi nhưng không bao giờ đặc biệt hữu ích trong C# trước đây. Không giống như các ngôn ngữ khác như VB.NET và C++/CLI. Bắt đầu với C# v4, nó diễn giải thuộc tính khác nhau và trình biên dịch sẽ mã cứng Type.Missing làm giá trị tùy chọn cho loại đối số của đối tượng . Hãy thử thay đổi loại đối số thành, ví dụ: chuỗi và lưu ý rằng mặc định sẽ khác. Null, như bạn mong đợi.

Đây không phải là điều rất thú vị, Type.Missing là một giá trị mặc định khá lẻ đối với đối tượng trong mã C# bình thường. Mọi người sẽ mong đợi null thay thế. Tuy nhiên nó là rất thiết thực, viết Office interop code trong C# trong các phiên bản trước 4 là một bài tập khá khủng khiếp.Các công ty có thể gặp rắc rối khi họ làm những thứ như btw này, nếu Neelie Kroes nhận được gió của nó, cô sẽ khiến Microsoft phải trả một tỷ Euro cho điều đó :)

+0

Tôi đánh dấu đây là câu trả lời, vì nó trả lời điểm 1 & 2. Đối với điểm 3, cuốn sách 'C# trong một Nutshell' giải thích rằng đây là một khoản trợ cấp đặc biệt cho COM, để đơn giản hóa mã gọi COM. 4 chắc chắn là một lỗi - nó là sai đồng bằng. – wezten

4

Vấn đề là, thư viện InterOp không thực sự được viết bằng C# và không phải tuân thủ các quy tắc của C#. Điều duy nhất nó phải là hợp lệ IL.

Trình xem siêu dữ liệu Visual Studio cố gắng hết sức để hiển thị cho bạn siêu dữ liệu bằng ngôn ngữ bạn chọn (trong trường hợp này là C#), vì nó thường dễ đọc hơn nhiều so với sử dụng mã IL. Điều này có thể gây hiểu lầm trong một số trường hợp (ví dụ: ref thông số không thực sự là ref s trong C#, thông số mặc định trước khi C# có tham số mặc định, giá trị không cố định trong tham số mặc định ...), nhưng nó thực sự chỉ là một tác dụng phụ của thực tế là VS không thực sự biết ngôn ngữ được sử dụng để xây dựng thư viện, và thậm chí nếu nó đã làm, bạn sẽ không muốn thấy rằng - bạn quan tâm đến giao diện tiếp xúc với bạn trong C#, hoặc một cái gì đó càng gần nó càng tốt. Lưu ý rằng các tham số mặc định đó thực sự hoạt động hoàn toàn khác với C# 's - C# được giải quyết tại thời điểm biên dịch phía máy khách (ví dụ: thay đổi tham số mặc định trong thư viện tham chiếu sẽ không thay đổi chúng trong mã người dùng cho đến khi bạn biên dịch lại mã đó quá) , Đây không phải là. Như tôi đã nói, VS làm tốt nhất của nó để gần đúng, nhưng các ngôn ngữ CLR có thể rất khác nhau thực sự.

+0

Xem nhận xét của tôi về câu trả lời của @ HansPassant. Dường như tất cả điều này là do thiết kế, thay vì trình xem siêu dữ liệu của VS đang cố gắng hết sức. Ngoài ra tôi nghĩ rằng đoạn cuối cùng là không chính xác, và các tham số mặc định COM cũng được nướng vào phía khách hàng. – wezten

Các vấn đề liên quan