質問

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

たとえば、私の2つの.NETアセンブリがsome.asembly.a.dllとsome.asembly.b.dllだとします。これは、vb6.exe.manifestがどのように見えるかです(以下のバージョン= 1.1.0.0を使用します。 AssemblyInfo.csの.NET AssemblyVersionに設定します):

<?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.asembly.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>

私も走ります tlbexp TLBファイルを作成するための参照DLLで、これがVB6プロジェクトファイルで参照されるものです。

Windows 7 64ビットマシンに移動したいです。同じ方法を使用して、win7マシンに.netオブジェクトをインスタンス化するVB6コードを押したときに取得します

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

XPでは、成功します。意図的にvb6.exe.manifestの依存アセンブリを間違えた場合 - xpで私は取得します

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

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

役に立ちましたか?

解決

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

他のヒント

vb6.exeを再コンパイルしている場合、またはWin7マシンのために処理する場合、新しい開発ツールのいくつかがマニフェストを自動的に埋め込んでいることを知っておく必要があります。 、そして、ID 1)のリソースrt_manifestを探します。埋め込まれたマニフェストがある場合、外部マニフェストは無視されます。そのため、外部のマンフィートを編集すると、何も起こりません。その内容は無視されます。

SxStraceについてErnoが言ったこと(SxStraceから得た結果を投稿できますか?)に加えて、マニフェストが埋め込まれている場合はVB6.exeのタイムスタンプを更新してください。 Vista + Win7キャッシュマニフェストの内容をキャッシュし、ルートマニフェストのタイムスタンプからキーオフして、ローカルの編集が拾われない可能性があります。 SxStraceが空白の結果を提供している場合は、タイムスタンプを更新して再試行してください。

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

さらに、(順序で)問題を絞り込もうとすることができます

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

幸運を!

先日、このハイブリッドデバッグを行っていて、エラーが発生しました。「ActiveXコンポーネントはオブジェクトを作成できません」 デバッグハイブリッドビジュアルベーシック6.0/ビジュアルベーシック.NETアプリケーション そして、裸の骨の例があなたのWin7 PCで動作することを確認してください(私はそれがRegasmで動作することを再検討します)。次に、reg free bitを使用して、次のリンクを調査しました。 Regasm.exeを使用せずにVB6からの.NETオブジェクト? そしてここ .NETベースのコンポーネントの登録なしのアクティブ化:ウォークスルー

使用しようとするかもしれません /win32 のオプション tlbexp x64 OSで。

から このブログ投稿

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

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

他のことは、Vista/Windows 7でUACに簡単に遭遇できるということです。それを確認しましたか?

によって作成されたマニフェストを使用して、Win 7-64でVB6の.NETクラスを成功して使用することができました 並んでマニフェストメーカー. 。無料試用版があります。

クラスが対象とする.NETランタイムバージョンを含めることを忘れないでください。 Win 7には、.NET 4クライアントプロファイルがプリインストールされているため、最初にあなたの問題かもしれません。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top