2012-03-06 46 views
12

Có thể sử dụng COM đăng ký miễn phí với Dotnet interop và C# không? Nếu vậy làm thế nào để thêm một tham chiếu đến đối tượng COM trong dự án C#?Reg miễn phí COM interop với C#, có thể?

Tôi có một tệp dll máy chủ ATL COM miễn phí với một tệp kê khai được nhúng và hai trình kiểm tra, một cpp khác C#. Các khách hàng cpp tham chiếu một cách chính xác các đối tượng COM sử dụng một tuyên bố nhập khẩu và một trong hai

#pragma comment(linker, "\"/manifestdependency:type='win32' name='TestComSvr2' version='1.0.0.0'\"") 

hoặc thiết lập để 'bổ sung Manifest Dependencies "type = 'win32' name = 'TestComSvr1' phiên bản = '1.0.0.0'" dưới Linker -> Tùy chọn Tệp kê khai, sau đó trình khách cpp sẽ chạy chính xác miễn là thành phần COM nằm trong cùng một thư mục.

Máy khách C# dù không chịu chơi.

Cố gắng thêm một tài liệu tham khảo tập tin vào một trong hai dll thành phần COM không đăng ký hoặc kết quả TLB không đăng ký trong các lỗi:

"A reference to 'blah blah' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component".

Đăng ký chỉ là thư viện kiểu với 'regtlib TestComSvr' và sau đó tạo ra một tập tin hoặc COM tài liệu tham khảo để có kết quả trong C# dự án thất bại trong việc xây dựng với:

"Error loading type library/Dll. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))".

Đăng ký thành phần COM và tạo ra một tài liệu tham khảo bình thường trong C# dự án, thiết lập các tham chiếu đến Isolated, xây dựng các dự án # c sau đó unregistering thành phần và chạy C# dự án dẫn đến ngoại lệ này:

Retrieving the COM class factory for component with CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Lưu ý: Ngay cả nếu điều này làm việc nó sẽ không phải là một trường hợp rất hữu ích dù sao, kể từ cuối cùng nó vẫn yêu cầu đăng ký của các thành phần, tôi chỉ thử nghiệm nó cho triệt để.

Cho đến nay, cách duy nhất tôi có thể tham chiếu đối tượng COM từ C# là bằng cách đăng ký đối tượng COM, tất nhiên hoàn toàn đánh bại điểm kể từ đó không hoàn toàn miễn phí.

Bất kỳ ai có ý tưởng nào?

(Đây là trên WinXP với VS2010 sp1).

+0

Tự hỏi liệu bạn có cần tạo tệp kê khai cho exe studio trực quan không? tìm thấy liên kết này, nhưng không chắc chắn nếu đó là tất cả những hữu ích http://msdn.microsoft.com/en-us/library/ms973913.aspx – PeskyGnat

+2

Ngoài ra, những gì nếu bạn tạo một dll interop với tlbimp và tham khảo đó? tức là với 'tlbimp '? – PeskyGnat

Trả lời

12

Bạn cần phải:


  1. Bạn cần phải đưa ra biểu hiện lắp ráp COM đăng ký miễn phí của bạn, nơi bạn nêu dependancy của bạn trên Neutrino.TestComSvr2 ​​ lắp ráp:

    <?xml version="1.0" encoding="utf-8"?> 
    <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" 
          xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" 
          xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    
        <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> 
    
        <!-- We depend on our COM object --> 
        <dependency> 
         <dependentAssembly> 
          <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" /> 
         </dependentAssembly> 
        </dependency> 
    
    
        <!-- 
         Everything else in this sample manifest is not relavent to this answer, 
         but every developer should be doing their job and writing correct 
         Windows programs 
        --> 
    
        <!-- Disable file and registry virtualization. --> 
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
         <security> 
         <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
          <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
         </requestedPrivileges> 
         </security> 
        </trustInfo> 
    
        <!-- We are high-dpi aware on Windows Vista --> 
        <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 
         <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
         <dpiAware>true</dpiAware> 
         </asmv3:windowsSettings> 
        </asmv3:application> 
    
        <!-- Declare that we were designed and tested on Windows 7--> 
        <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
         <application> 
          <!--The ID below indicates application support for Windows 7 --> 
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
          <!--The ID below indicates application support for Windows Vista --> 
          <!-- supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/ --> 
         </application> 
        </compatibility> 
    
        <!-- We depend on Common Controls version 6 (i.e. "enable themes") --> 
        <dependency> 
         <dependentAssembly> 
         <assemblyIdentity 
           type="win32" 
           name="Microsoft.Windows.Common-Controls" 
           version="6.0.0.0" 
           processorArchitecture="*" 
           publicKeyToken="6595b64144ccf1df" 
           language="*" 
         /> 
         </dependentAssembly> 
        </dependency> 
    

    Lưu ý: tôi đã có một biểu hiện tương tự như trong câu hỏi của tôi Registration-Free COM from ASP.NET?

  2. Sau đó, bạn cần phải bao gồm các ứng dụng này biểu hiện ở # exe C:

    1. Nhấp chuột phải vào dự án trong Solution Explorer.
    2. Nhấp vào "Thêm mục mới".
    3. Chọn "Tệp kê khai ứng dụng".

Những bước này cũng tương tự như những gì có thể được tìm thấy trên MSDN cho adding a manifest to a managed application.

Bạn cũng cần phải đảm bảo rằng Neutrino.TestComSvr2 ​​ lắp ráp của bạn chứa nó là mục COM đăng ký miễn phí:

Neutrino.TestComSvr2.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 

    <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" /> 

    <file name = "ContosoFrobber.dll"> 

     <comClass 
      progid="Frobber.Gizmo" 
      clsid="{00028C00-0000-0000-0000-000000000046}" 
      description="Gizmo Frobber by Contoso" 
      threadingModel = "Apartment" /> 

     <typelib 
      tlbid="{00028C01-0000-0000-0000-000000000046}" 
      version="1.0" 
      helpdir=""/> 
    </file> 
</assembly> 

Và blingo blango, bạn nên làm việc.

+0

Một sự kết hợp của điều này và gợi ý của PeskyGnat để tạo ra lắp ráp interop từ tlb trực tiếp cuối cùng đã làm việc này mà không cần đăng ký hoặc là thành phần COM hoặc thư viện kiểu của nó. Cảm ơn rất nhiều. – Neutrino

+0

Biểu hiện này làm việc cho tôi gần như là, nhưng tôi đã phải đặt ".dll" ở cuối tên của dependendAssebmly trong tệp kê khai ứng dụng: name = "mycomserver.dll". –

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