2017-02-03 7 views
2

を開始する方法:Out-of-process C# COM server (CSExeCOMServer)私はCOM-Server用のMicrosoftの例を使用しAnyCPUコンパイルCOMサーバー

簡単なコンソールCOMクライアントだけでサーバーを起動し、そのメソッド、プロパティおよびイベントを使用する必要があります。

static void Main(string[] args) 
    {    
     Type type = Type.GetTypeFromCLSID(new Guid(SimpleObject.ClassId)); 

     if (type == null) 
     { 
      throw new Exception("ClientObject component is not registered"); 
     } 

     ISimpleObject comObject = (ISimpleObject)Activator.CreateInstance(type); 

     string what = comObject.HelloWorld(); 

     float fvalue = (float) 2.22; 
     comObject.FloatProperty = fvalue; 
     fvalue = (float)3.33; 
     fvalue = comObject.FloatProperty; 
    } 

これは実際には直接動作します。サーバーは、構成されたプラットフォームターゲットx86のため32ビットで起動しました。しかし、私は64ビットのOSを持っていて、今は64ビットで動作させたいと思っています。 登録は、サーバーのポストビルドイベントで行われます。だから私は、サーバーも64ビットに登録されるように(Framework64のRegasm.exeによってを使用して)登録を変更しました。次に、PlatformターゲットをAnyCPUに変更しました。 私は今、クライアントを起動した場合には、ライン

ISimpleObject comObject = (ISimpleObject)Activator.CreateInstance(type); 

に掛かるしかし、私は、サーバーが正しく64-ビットで起動されたことをタスクマネージャで見ることができます。 1分程度の時間の後、私は次の例外を取得:

Retrieving the COM class factory for component with CLSID {DB9935C1-19C5-4ED2-ADD2-9A57E19F53A3} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at ConsoleClient.Program.Main(String[] args) in C:\Source\User\MaLe\Tests\CSExeCOMServer\C#\ConsoleClient\Program.cs:line 17 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

私は手でサーバーのexeファイルを起動して、再度COMによってそれに接続しようとすると、私はクライアントが起動することをタスクマネージャで見ることができます第2のサーバに接続するのではなく、第2のサーバに接続する。この1は64ビットで確かであるが、例外が発生し、第二のサーバは同様に閉じクライアントを閉じた後。 私はPrefere 32ビットフラグでAnyCPUで32ビットであることをサーバーに強制した場合すべてがうまくしかし、32ビットで動作します。プラットフォームターゲットをx64に設定しても、64ビットでもすべて正常に動作します。だから64bitで起動するとAnyCPUの設定でしか動かない。

誰も私が間違って何をすべきかのアイデアを持っていますか? 私は実際にも、64ビットとAnyCPU構成で実行するCOM-サーバーを必要としています。私は実際に別々の32ビットと64ビットのexeを持っているとは思わない。それは私が途中でテストしたときにもうまくいった。

ありがとうございました。

+0

_ "...クライアントは最初のサーバーに接続するのではなく、2番目のサーバーを起動します..."_ - あなたがIROTを介して" COMシングルトン "を使用していない限り、それは正常な動作です – MickyD

+0

[AnyCPU Exesは通常、彼らが価値あるものよりもトラブルが多い](https://blogs.msdn.microsoft.com/rmbyers/2009/06/09/anycpu-exes-are-than-theyre-worth /) –

+0

@MickyDはい、私はシングルトンCOMサーバーを使用しています。これが私がそれを奇妙な振る舞いにした理由です。 – MaLe

答えて

1

Does anyone have an idea what I do wrong? I really need a COM-Server to run in AnyCPU configuration even with 64bit. I actually do not want to have seperate 32bit and 64bit exe's.

COMでは、32ビットと64ビットと2つの異なるアウトプロセスCOMサーバーに対して別々のCOM登録が必要です。したがって、32ビットのCOM exeと64ビットのexeが必要です。あなたは両方のために1つを持つことはできません。 WindowsのExplorerのシェル拡張の

  • ビット固有のバージョン:

    あなたは次のようにどこでも、この例が表示されます。例えばTortoiseSVN; TortoiseGit。 64ビットWindows上で動作するWindowsエクスプローラは、64ビット拡張のみを受け付けます。同様に、32ビットのWindows上でCOMアドイン

に同じbit化して(今いくつかの時間のためにCOM/OLEとなっている) のMicrosoft Office

  • 別の32ビット版と64ビット版を実行するための

    唯一の方法は、適切なDCOM登録を追加してサーバーを別のボックス(Windows 64ビットを実行している)で実行すると、32ビットクライアントを64ビットサーバーに接続したいということです。クライアントがネットワーク経由でクライアントに接続します。しかし、それはおそらく特に有用ではないでしょう。

  • +0

    実際に必要なのは、32ビットと64ビットのプロキシdllで、これはおそらくあなたが望むものです。 –

    +0

    オハイオ州私は理解しています。これは、AnyCPUのようなものがある理由です.1つのexeは、32ビットの32ビットOSで動作し、64ビットのOSは64ビットOSで動作するようにしていますが、COM-Interfacingを使用するとできないでしょうか? – MaLe

    +0

    @MaLe that'sこれはAny CPUを使用する場合の一例ですd – MickyD

    関連する問題