4

C# クラス ライブラリ アセンブリを作成し、PHP からメソッドを呼び出せるように COM で表示できるようにしました。これは以前は正常に機能していましたが、Windows Server 2008 サーバーにインストールしようとすると、「クラスが登録されていません」というエラーが表示され続けます。

依存関係の問題を排除するために、C# で小さなテスト クラス ライブラリを作成しました。クラス ライブラリは任意の CPU 用に構築されており、COM に表示されます (AssemblyInfo.cs で COMVisible を true に設定します)。テスト クラス ライブラリには、1 つのメソッドを持つ 1 つのクラスのみが含まれます。クラスは TestLib と呼ばれ、名前空間も TestLib と呼ばれます。このメソッドは Test と呼ばれ、文字列のみを返します。

- TestLib.dll をビルド - Windows Server 2008 マシンにコピー - dll を次のように登録: regasm /codebase TestLib.dll - regasm ツールが成功メッセージを返す - PHP では単純に新しい COM インスタンスを作成します。

try
{
   $test = new COM("TestLib.TestLib");
}
catch (Exception $e)
{
   die($e->getMessage());
}
  • ブラウザまたはコマンドライン (php -f test.php) からこのテスト スクリプトを呼び出すと、どちらの場合も「クラスが登録されていません」というエラーが表示されます。

また、gacutil -i を使用して TestLib を GAC に追加しようとしましたが、役に立ちませんでした。まだクラスが登録されていないエラーです。

次に、ターゲット フレームワークとして 4.0 ではなく .NET 2.0 を使用してテスト ライブラリをコンパイルしようとしましたが、同じ結果になりました。ちなみにサーバーには.NET Framework 4.0がインストールされています。

何か案は?

4

2 に答える 2

3

さて、さらに調査した結果、私はそれを理解しました。php.exe プロセスは 32 ビットです。COM 可視アセンブリは任意の CPU 用にコンパイルされているため、32 ビットと 64 ビットの両方のアプリケーションからアクセスできます。

問題は、64 ビット OS の php.exe と、それに関する 32 ビット プロセスでは、HKEY_CLASSES_ROOT\CLSID の代わりに HKEY_CLASSES_ROOT\Wow6432Node\CLSID を検索し、HKEY_LOCAL_MACHINE\Software の代わりに HKEY_LOCAL_MACHINE\Software\Classes\Wow6432Node\CLSID を検索することです。 \クラス\CLSID. Wow6432 キーのレジストリ エントリは、Windows Server 2008 の .NET Framework v4 に同梱されている regasm では作成されません。Windows 7 では作成されますが、理由は聞かないでください。

また、.NET v2.0 用の小さなテスト アセンブリを作成し、それを .NET Framework v2.0 に同梱されている regasm に登録すると、Windows 2008 で Wow6432Node エントリが作成されることもわかりました。奇妙なことです。

したがって、私の解決策は、次を使用してサーバー上に基本的なレジストリ ファイルを作成することです。

regasm /regfile MyClassLib.dll

これにより、'通常の' 64 ビット エントリのみを含むファイル MyClassLib.reg が作成されます。次に、Wow6432Node キーを Windows 7 マシンからエクスポートし、その .reg ファイルに追加しました。そのregファイルをWindows 2008のレジストリにインポートすると、すべて正常に動作します。

Wow6432Node エントリの詳細については、http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx を参照してください。

これが他の誰かの時間と頭痛の種を救うことを願っています.

于 2012-06-08T09:37:25.143 に答える