16

VB6コードから使用する.NETコードがいくつかあります。私は常に、依存する.NETアセンブリをリストしたVB6.exe.manifestファイルを作成することにより、XPマシンでこれを開発してきました。

たとえば、私の2つの.NETアセンブリがSome.Assembly.A.dllとSome.Assembly.B.dllであるとすると、VB6.EXE.manifestは次のようになります(以下のバージョン=1.1.0.0を使用します。これがバージョンです。 AssemblyInfo.csで.NETAssemblyVersionを設定しました):

<?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.1.0.0" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.A"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.B"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
</assembly>

次に、同じディレクトリ内のDLLとともに、アセンブリと独自のマニフェストファイルがあります。「Some.Assembly.A.dll.manifest」の例を次に示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
  <assemblyIdentity
      type="win32"
      name="Some.Assembly.A"
      version="1.1.0.0" />
  <clrClass
      clsid="{F1234567-1234-1234-1234-123456789012}"
      progid="Some.Assembly.A.Class1"
      threadingModel="Both"
      name="Some.Assembly.A.Class1" >
  </clrClass>
  <file name = "Some.Assembly.A.dll" />
</assembly>

また、参照されているDLLを実行tlbexpしてTLBファイルを作成します。これは、VB6プロジェクトファイルで参照しているものです。

Windows 764BITマシンに移行したい。同じ方法を使用して、WIN7マシンで.NETオブジェクトをインスタンス化するVB6コードをヒットすると、次のようになります。

ActiveXコンポーネントはオブジェクトを作成できません。」

XPでは成功します。VB6.EXE.manifestの依存アセンブリのスペルを意図的に間違えた場合-XPでは

「アプリケーションの構成が正しくないため、このアプリケーションを起動できませんでした。アプリケーションを再インストールすると、この問題が解決する場合があります。」

WIN7では、VB6がロードされるだけです。WIN7のマニフェストを無視するようなものなので、WIN7のREGFREEメソッドを使用して.NETオブジェクトをロードすることはできません。regasmDLLの場合、すべてが機能します。
VB6をWIN7(64ビット)のreg free comで動作させる方法についてのアイデアはありますか?

4

8 に答える 8

1

vb6.exeを再コンパイルするか、win7マシン用に処理する場合は、新しい開発ツールの一部がマニフェストを自動的に埋め込むことを知っておく必要があるため、それを確認することをお勧めします(VSで実行可能ファイルを開くのが簡単な方法です)。 、およびIDが1)のリソースRT_MANIFESTを探します。埋め込まれたマニフェストがある場合、外部マニフェストは無視されます。これが、外部マニフェストを編集するときに何も起こらず、その内容が無視される理由である可能性があります。

Ernoがsxstraceについて言ったこと(sxstraceから取得した結果を投稿できますか?)に加えて、マニフェストが埋め込まれている場合はVB6.exeのタイムスタンプを更新し、そうでない場合はVB6.exe.manifestを更新してください。Vista + Win7は、マニフェストのコンテンツをキャッシュし、ルートマニフェストのタイムスタンプをキーオフして、ローカル編集が取得されないようにします。sxstraceで空白の結果が表示される場合は、タイムスタンプを更新して再試行してください。

于 2011-01-10T09:35:33.313 に答える
1

最初に頭に浮かぶのは、.netコードに署名してみる価値があるということです。署名されたアセンブリ参照を必要とするwin764ビットには、暗黙的に高レベルのセキュリティが適用されている可能性があります。

さらに、(順不同で)問題を絞り込むことができます

  • 管理者として実行するプログラムにラベルを付けて、再試行してください。
  • 「xp/win2k互換モード」で実行するプログラムにラベルを付けます
  • これをdependencywalkerで実行します(プログラムの負荷をシミュレートするオプションがあり、エラーをログに記録します)

幸運を!

于 2011-01-27T21:48:44.390 に答える
1

先日、このハイブリッドデバッグを行っていたところ、「ActiveXコンポーネントがオブジェクトを作成できません」というエラーが発生しました。この記事「ハイブリッドVisual Basic 6.0 / Visual Basic .NETアプリケーションのデバッグ」に従って、必要最低限​​の例を確認することをお勧めします。 Win7 PCで動作します(私はそれがregasmで動作することを実感しています)。次に、REG FREEビットを使用して、次のリンクを調査しました。regasm.exeを使用しないVB6の.NETオブジェクト?.NETベースのコンポーネントの登録なしのアクティベーション:ウォークスルー

于 2011-02-12T00:22:39.647 に答える
1

WinXP互換モードでVB6をインストールして実行してみましたか?

于 2011-02-24T16:16:09.597 に答える
0

x64OSでの/win32オプションを使用してみてくださいtlbexp

于 2011-01-01T16:03:35.483 に答える
0

このブログ投稿から

SxsTraceを使用して、問題のデバッグに役立てることができます。トレースを開始するには、「SxsTrace Trace -logfile:SxsTrace.etl」を実行して、ログファイルを表示可能なものに変換します。「SxsTraceParse -logfile:SxsTrace.etl -outfile:SxsTrace.txt」を実行します。

あなたはそれを試しましたか?

もう1つは、Vista / Windows 7ではUACに簡単に遭遇する可能性があるということです。それを確認しましたか?

于 2011-01-08T07:33:02.760 に答える
0

Regasmは、TLBまたは必要なレジストリキーを生成するだけではありません。

たとえば、COM可視タイプに基づいてCOM可視インターフェースを生成できます。たとえば、COM可視タイプがインターフェイスを実装していない場合、Regasmはこれを実行します。

インターフェイスを実装していない(またはComDefaultInterfaceAttributeを使用してCOMインターフェイスを定義していない)COM可視タイプはありますか?

もしそうなら、これはあなたの問題かもしれません。

于 2011-02-14T13:28:08.927 に答える
0

Side by Side Manifest Makerによって作成されたマニフェストを使用して、Win7-64でVB6の.Netクラスを正常に使用することができました。無料トライアルがあります。

クラスが対象とする.Netランタイムバージョンを含めることを忘れないでください。Win7には.Net4クライアントプロファイルのみがプリインストールされているため、これは最初から問題になる可能性があります。

于 2011-02-20T10:36:20.890 に答える