2011-11-17 51 views
5

これは非常に具体的ですが、私は仕事の一日を失いましたので、私は本当に合理的な説明が必要なので、上司と私の妻はMSDNによると、私に
RegAsm regfileスイッチがコードベーススイッチと同じ出力を出さない

を発射:
/regfileスイッチを
/codebaseスイッチが

「組立用のファイルパスをspecifiyingレジストリ内のコードベースエントリを作成します」「アセンブリのための指定された.regファイルを生成します」

私は、2つの異なる方法で同じもの。真実であったが、私が間違っていた:

METHOD 1

C:\>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\SERVER.dll" /regfile 
Registry script 'C:\SERVER.reg' generated successfully 

REGファイル出力:

REGEDIT4 

[HKEY_CLASSES_ROOT\xfeed.server.X] 
@="SERVER.XLS" 

[HKEY_CLASSES_ROOT\xfeed.server.X\CLSID] 
@="{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}] 
@="SERVER.XLS" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32\1.0.0.0] 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\ProgId] 
@="xfeed.server.X" 

[HKEY_CLASSES_ROOT\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories\  {62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}] 

METHOD 2

しかし、私は直接コードベースのスイッチコマンドを実行するときむしろregファイルを使用して、 rに影響を与えたキーegsitry

C:\>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "C:\SERVER.dll" /codebase 
Types registered successfully 

(前の出力の逆に、仕事)コードベースを持つレジストリouptut異なっている:あなたはお気づきのように

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}] 
@="SERVER.XLS" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 
"CodeBase"="file:///C:/SERVER.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\InprocServer32\1.0.0.0] 
"Class"="SERVER.XLS" 
"Assembly"="SERVER, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6e3de07ee666a5f5" 
"RuntimeVersion"="v2.0.50727" 
"CodeBase"="file:///C:/SERVER.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{8F4A5B5E-8DD7-30A3-993F-18C7E2C457CF}\ProgId] 
@="xfeed.server.X" 




、スタッフはWOW6432NODEになりましたと情報がはるかに包括的です(特にCodeBase !!!)

誰かが私にこれに合理的な理由を与えることができたら、私は私は非常に感謝しています

+0

64ビットバージョンではなく32ビットRegAsmを使用していたため、アセンブリの登録に問題がありました。同じ/ Codebaseパラメータを使用して両方のツールに登録してみましょう。 –

+0

何の根拠ですか?これはすべて正常です。あなたのdevマシンで/ codebaseを使い、.regファイルを正しいバージョンのregedit.exeでレジストリに再生してください。 c:\ windows \ syswow64 \ regedit.exe(32ビットCOMサーバー用)インストーラを手に入れようとする以外に、regファイルを使うのはちょっと難しいことです。 –

+0

@HansPassant:クライアントマシンでRegAsmを呼び出して展開するのではなく、明示的なインストールスクリプトを作成したいと思っていたため、regfileを使用している点があります。 –

答えて

8

codebaseフラグはregasmに、ファイルの実際の場所への参照を持つDLLを登録するよう指示します。これは、展開されたアプリケーションと共にdllが格納されていて、GACでDLLを必要としない場合に便利です。このフラグを使用しないと、DLLをGACに組み込んで完全な機能を実現する必要があります。

regfileフラグはregasmに、実際にdllを登録するレジストリファイルINSTEADを出力するように指示します。

これらは、レジストリ以外の場所にあるデータが格納されているレジストリファイルの出力が必要な場合に、一緒に使用できます。

EDIT:あなたのコメントに基づいてさらに説明します。

RegAsmは、通常、GACにロードされることを想定しているため、.dllに関する基本情報を登録します。 GAC内のすべてのものは、システムがアセンブリを制御してメモリにロードできるように登録されています。 32ビットシステム上でcodebaseフラグを使用すると、アセンブリベースのレジストリキーに「コードベース」の値キーがほぼ直接追加され、この値が.dllが物理的に配置されているパスに設定されます。

このように登録すると、基本的にコンピューターとコードを見つけることができるアセンブリを使用するためのあらゆるものと、メモリーにロードする方法が表示されます。場合によっては、呼び出しプロセスがアセンブリにアクセスする最善の方法を知るために、GACが必要とするキー以外の余分なキーが発生することがあります。

あなたは64ビットシステムを使用しているので、新たな課題に直面します。 32ビットおよび64ビットアプリケーションをコンピュータ全体に分けて保存するためのルールが用意されています。そのため、2つのプログラムファイルフォルダがあり、レジストリにwow32セクションがあるのはなぜですか。 32ビットのDLLが登録された場合は、/ codebaseフラグを使用してレジストリのこのセクションに格納する必要があります。これにより、32ビットのアプリケーションがレジストリにアクセスできる唯一の部分です)。それが64ビットdllだったなら、レジストリのこの部分に入る必要はありません。

この情報のため、ファイルの出力を使用してインストーラのレジストリスクリプト部分を書き込む場合、ターゲットマシンをチェックして、その情報がユーザーの中にある必要があるかどうかを判断する必要がありますセクション、またはレジストリの通常のセクションを編集し、実行する前にこのスクリプトを適切に変更してください。

+0

聖なる牛。このようにすれば、物事ははっきりと分かります。 Howdyaはそのバディを知っていますか? MSDNはそれほど明白ではないので、私は本当に混乱しました。基本的には、実際にコードベースswtichが実際に行っていることを実際に見るためにregfileスイッチを使用しました。しかし、私は間違っていたと思います。それを行う方法はありますか? –

+0

あなたはそれが何をしているのかを確信していませんが、あなたが求めていることを説明しようとします。 – Nikkoli

関連する問題