2012-03-06 22 views
12

Dotnet interopとC#で登録不要のCOMを使用することはできますか?もしそうなら、C#プロジェクトのCOMオブジェクトへの参照をどのように追加しますか?C#との無料のCOM interop登録が可能ですか?

私は、埋め込みマニフェストと2つのテストクライアントを持つ、無料のATL COMサーバーdllを持っています.1つのcppともう1つのc#です。 CPPクライアントが正しくimport文を使用してCOMオブジェクトを参照して

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

またはリンカの下にある「追加のマニフェストの依存関係」「タイプ= 『win32の』名前= 『TestComSvr1』バージョン= 『1.0.0.0』」への設定のいずれか - >マニフェストファイルオプション。その後、COMコンポーネントが同じディレクトリにある限り、cppクライアントは正しく実行されます。

C#クライアントは、まったく再生を拒否します。

未登録のCOMコンポーネントDLLまたはエラーに未登録のTLB結果のいずれかにファイル参照を追加しよう:

"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".

「はregtlibのTestComSvr」とだけタイプライブラリを登録して、ファイルまたはCOMのいずれかを作成します次に、C#プロジェクトを構築する登録解除、単離さへの参照を設定し、

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

COMコンポーネントを登録し、C#プロジェクトで通常の参照を作成する:それへの参照をして構築に失敗C#プロジェクトをもたらしますコンポーネントと、この例外ではC#プロジェクトの成果を実行している:

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)).

注:最終的にそれはまだコンポーネントの登録を必要とするので、これは働いていたとしても、それは、とにかく便利なケースではない、私はちょうどそれをテストしました徹底。

これまでのところ、COMオブジェクトをC#から参照できる唯一の方法は、COMオブジェクト自体を登録することですが、それ以来、ポイントは完全に無制限ではありません。

誰でもアイデアがありますか?

(これはVS2010 sp1のWinXP上にあります)。

+0

Visual Studio専用のマニフェストファイルを作成する必要があるのではないかと思いますか?このリンクが見つかりましたが、それが役に立つかどうかは不明です。http://msdn.microsoft.com/en-us/library/ms973913.aspx – PeskyGnat

+2

さらに、tlbimpでinterop dllを作成して参照するとどうなりますか?すなわち 'tlbimp '? – PeskyGnat

答えて

12

あなたがする必要がある:


  1. あなたがニュートリノのあなたの依存を述べるあなたの登録フリーCOMのアセンブリマニフェスト、思い付くする必要があります。TestComSvr2アセンブリ:

    <?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> 
    

    注:私は、あなたがC#のexeファイルでは、このアプリケーションマニフェストを含める必要があり、私の質問Registration-Free COM from ASP.NET?

  2. で同様のマニフェストを持っていた:

    1. ソリューションエクスプローラでプロジェクトを右クリックします。
    2. 「新しい項目の追加」をクリックします。
    3. 「アプリケーションマニフェストファイル」を選択します。

これらの手順は、adding a manifest to a managed applicationについては、MSDNで見つけることができるものと類似しています。また、あなたのNeutrino.TestComSvr2アセンブリが、それは登録無料のCOMエントリだ含まれていることを確認する必要があり

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> 

そしてblingoのblango、あなたが作業する必要があります。

+0

これとPeskyGnatの提案を組み合わせて、tlbからinteropアセンブリを生成すると、COMコンポーネントまたはそのタイプライブラリを登録せずに直接この作業を行うことができました。 ありがとうございました。 – Neutrino

+0

このマニフェストはほぼそのまま私の働きをしましたが、アプリケーションマニフェストのdependendAssebmlyという名前の末尾に ".dll"を入れなければなりませんでした:name = "mycomserver.dll" –

関連する問題