1

レガシ COM コンポーネントの展開を容易にするために、Web アプリケーションで Reg-Free COM を使用できるかどうかを確認しようとしています。ただし、Interop の状況での使用などを検討する前に、簡単なテストを実行することはできません。これが私がやったことです:-

1) 新しい VB ActiveX DLL プロジェクトを作成します。バイナリ互換性をオンにすることを除いて、すべてのオプションをデフォルトのままにしました。「SayHello」という簡単なメソッドを持つクラスを追加しました。
2) Vs.NET 2008 (SP1) で新しい c# コンソール アプリを作成します。CPU を x86 に設定し、COM DLL への参照を追加しました。
3)参照用に「Isolated」をオンにしました
4)C#コンソールアプリからSayHelloメソッドを呼び出します-すべて機能します。
5) regsvr32 /u を使用して COM dll を手動で登録解除
します。 6) コンソール アプリを再度実行してみます。COM 登録情報が見つからないため、アプリは COM エラーで失敗します。マニフェストが存在することを確認できます(以下に貼り付けます)

それが違いを生む場合、私はこれをVista、64Bitで実行しています。

ご指摘ありがとうございます。

<?xml version="1.0" encoding="utf-8"?>
<assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity name="TestRegFreeCom.exe" version="1.0.0.0" processorArchitecture="x86" type="win32" />
  <file name="TestProject.dll" asmv2:size="20480">
    <hash xmlns="urn:schemas-microsoft-com:asm.v2">
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>uIK8e9FAnH4SQwk6PRfrjdZHWuw=</dsig:DigestValue>
    </hash>
    <typelib tlbid="{08dcd362-63a1-424a-8c4e-e72dcda2a8e2}" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
    <comClass clsid="{c540c43a-4d80-4c87-9091-dff664df0021}" tlbid="{08dcd362-63a1-424a-8c4e-e72dcda2a8e2}" progid="TestProject.Testy" />
  </file>
</assembly>
4

3 に答える 3

2

コード サンプルは、COM オブジェクト DLL のマニフェストのようです。メインプログラムのマニフェストもありますか? 他のオブジェクトを依存関係としてリストするものが必要です。

このトピックに関する以前の質問に答えるにあたり、私のテストは、VB5/VB6 で提供された古い ActiveX コントロールを使用する C# プログラムでした。メイン プログラムのマニフェストは次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
<assemblyIdentity
            type = "win32"
            name = "client"
            version = "1.0.0.0" />
<dependency>
            <dependentAssembly>
                        <assemblyIdentity
                                    type="win32"
                                    name="MSFLXGRD.X"
                                    version="6.1.97.82" />
            </dependentAssembly>
</dependency>
</assembly>

dependentAssembly/assemblyIdentity 要素の name 属性は、COM DLL のマニフェスト内の属性と一致する必要があります。ここでわかるように、実際のファイル名である必要はありません。

もう 1 つの考えられる問題は、マニフェストに comInterfaceExternalProxyStub 要素がないことです。そのタグのサンプルと他に何をすべきかのチュートリアルは、MSDN の記事: COM コンポーネントの登録不要のアクティブ化: ウォークスルー にあります。ステップ 6 と 7 では、2 つのマニフェストの作成について説明しています。

于 2008-11-25T18:24:56.453 に答える
2

アプリケーションで .dll を参照する場合は、プロジェクトの参照の下で参照されている dll をクリックし、プロパティを見て、Isolated を TRUE に設定します。

これにより、プロジェクトに .dll が含まれ、アプリケーションはプロジェクトに含まれる .dll のコピーを使用します。

この外観の実際の例を見るには、次のようにします。

http://archive.msdn.microsoft.com/SEHE

問題の .dll は、これが正しく機能するために、アプリケーションをビルドするシステムに登録する必要があります。

于 2008-12-29T19:54:26.190 に答える
0

返信ありがとうございます。

追加したマニフェストは、.NETコンソールアプリケーションから自動生成されます。COMDLL自体のマニフェストが生成されていません。ウォークスルーをチェックして、それが答えを提供するかどうかを確認します。

于 2008-11-26T15:34:34.597 に答える