を開始する方法: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を持っているとは思わない。それは私が途中でテストしたときにもうまくいった。
ありがとうございました。
_ "...クライアントは最初のサーバーに接続するのではなく、2番目のサーバーを起動します..."_ - あなたがIROTを介して" COMシングルトン "を使用していない限り、それは正常な動作です – MickyD
[AnyCPU Exesは通常、彼らが価値あるものよりもトラブルが多い](https://blogs.msdn.microsoft.com/rmbyers/2009/06/09/anycpu-exes-are-than-theyre-worth /) –
@MickyDはい、私はシングルトンCOMサーバーを使用しています。これが私がそれを奇妙な振る舞いにした理由です。 – MaLe