問題タブ [comvisible]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
com - COM Interop と ComVisible(true) に登録する
複数のプロジェクトで使用される共通ライブラリがあります。プロジェクト全体で複数のバージョンを管理するために、厳密な名前で署名しました。このライブラリには、[ComVisble(true)] プロパティを持つクラスがいくつかあります。ただし、このライブラリを COM 相互運用用に登録したくありません。しかし、「COM Interop 用にアセンブリを登録してください」というコンパイル エラーが表示されます。
私は .Net で COM を初めて使用します。ライブラリに [ComRegisterFunction] がある場合にのみ、COM 相互運用のために登録する必要があると思います。私が間違っている場合は修正してください。
COM Interop に登録すると、厳密な名前付けはプロジェクト全体で複数のバージョンを維持するのに役立ちません。
これについての助けをいただければ幸いです。
c# - .net Com 可視クラスは使用できません
ライブラリを作成しましたが、そのための Com-wrapper を作成する必要があります。regasm は、com ライブラリの登録が成功したことを示しており、ライブラリを VBA 参照に追加していますが、メソッドとクラスは使用できません。
}
私はすべてチュートリアルで作成しましたが、結果はありません。
vbscript - c#.netを介してdllからvbスクリプトにVB6クラスを渡す
VB6 クラス (.cls ファイル) を含む dll があります。
これらのクラスを使用する VB スクリプトがあります。
Microsoft Script Control ライブラリを使用してスクリプトを実行する C#.Net プログラムがあります (参照: http://osherove.com/blog/2004/2/17/make-your-net-application-support-scripting-a-practical -appr.html )
これが私のコードです:
MyClass は、[ComVisible(true)] を使用した VB6 クラスに相当する C# です。
COM に表示される独自の C# クラスを作成する代わりに、自分のコードで dll から VB6 クラスを使用してそれをスクリプトに渡すことができるかどうかを知りたいです。
更新: 必要なすべての COM コンポーネントを登録し、COM dll を参照できるようになりました。ただし、COM dll でクラスのオブジェクトをインスタンス化しようとすると、エラー 80040154 Class not registered at run-time が発生します
c# - C# ComVisible DLL は、リモート デスクトップ接続時に IIS でのみ使用可能
特定のドメイン名 (私が勤務している会社) で署名された ComVisible DLL を作成しました。この DLL を別のドメインで実行されている顧客の Web ホスト マシンに配置し、C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs を使用して登録します。
DLL は、顧客の Web ホストのローカル ディスクに XLSX ファイルを作成します。ユーザーはブラウザでこのファイルをダウンロードできます。
顧客の Web ホストに対してリモート デスクトップ セッションを開いた場合、DLL は期待どおりに動作し、顧客は作成された一時ファイルをダウンロードできます。
ただし、リモート デスクトップ セッションをドロップするとすぐに (ログアウトせず、VPN を接続したままにします)、DLL にアクセスできなくなります。一時ファイルは asp クラシック サイトによって作成されなくなり、顧客はもちろん、作成されていないファイルをストリーミングすることはできません。
これを引き起こす原因について何か考えはありますか?Web サーバーはエラーを生成しません。
DLL が別のドメイン名で署名されており、Web サーバー ホストが問題の一部であると考えましたが、リモート デスクトップ セッションを開いている (Microsoft の mstsc を使用しているだけです) ことで問題が解決する理由を想像できません。
c# - ComVisible() 対 ComVisibleAttribute()
[ComVisible()]
との使用の違いは[ComVisibleAttribute()]
何ですか? 彼らはまったく同じことをしていますが、違いは何ですか?
ありがとうございました。
c# - Tlbimport (C# ライブラリから生成された tlb)
次のような単純な C# クラス ライブラリを作成しました (ClassLibrary1)。
そこから tlb をエクスポートして使用します。
importlib("ClassLibrary1.tlb"); idl ファイルで。
問題は、interface 型 (IMyTestInterface) を idl で使用できることですが、構造体にアクセスできず、その理由がわかりません。
したがって、この idl はコンパイルできます。
そして、これはそうではありません:
importlib("stdole2.tlb"); importlib("ClassLibrary1.tlb");
同じ結果で tagMyTestStruct を試しました。OleView で tlb を開くと、"MyTestStruct" が含まれています。
c# - シングル スレッド クライアントで ComVisible クラスを独自の AppDomain にインスタンス化する方法
問題
同じシングルスレッド COM クライアント内で 2 つの独立した .NET COM 可視クラスをインスタンス化する場合、.NET はそれらを両方とも同じ AppDomain に読み込みます。
これは、それらが同じスレッド/プロセスにロードされているためだと推測しています。
この動作の例は、この GitHub リポジトリに示されています。
基本的に、デモンストレーションは次のとおりです。
- 1 つの COM クラスをインスタンス化する
- バックエンドで を呼び出す最初の COM オブジェクトに属性を設定し
SetData
ますCurrentDomain
。 - 2 番目の独立した COM クラスをインスタンス化する (異なるインターフェイス名、GUID など)
AppDomain
属性を読む- 同じように見えることを証明する
- また、両方の からハッシュ コードを取得します。
AppDomain
これも同じであることに注意してください。
なぜこれが問題なのですか?
両方のクラスにAppDomain.CurrentDomain.AssemblyResolve
イベント (またはその他の AppDomain イベント) が実装されている場合、イベントは互いに干渉する可能性があります。これは、少なくとも 1 つの合併症です。他にもありそうな予感。
アイデア
これを処理する最善の方法は、COM オブジェクトごとに新しい AppDomain を作成することだと思いました。管理された方法でこれを行う方法を見つけることができなかった (または Google) ため、アンマネージ コードで行う必要があるのではないかと考えました。
ちょっとした探偵の仕事をしました。OleView では、.NET COM 可視クラスの InprocServer32 属性はmscoree.dll
. EXPORTS
そこで、すべてを mscoree.dllに転送する「shim」DLL を作成しました。排除のプロセス (COM が読み込まれなくなるまでエクスポートを排除する) によって、.NET ランタイムの起動と、インスタンス化された COM オブジェクトの返還を担当していたことがわかりましたDllGetClassObject
。mscoree
したがって、私ができることは、次のDllGetClassObject
ように独自の を実装することです。
- CLRCreateInstanceを使用してアンマネージ アセンブリで .NET ランタイムをホストする
- new でオブジェクトを作成し、
AppDomain
それを返します
(言うほど単純じゃないと思うけど)
質問
この困難で時間がかかる可能性のあるプロセスに着手する前に、次のことを知りたいです。
- 独自の AppDomain で実行する .NET COM 可視クラスを取得する管理された方法はありますか?
- そうでない場合、これは「正しい」方法ですか、それとも明らかな解決策がありませんか?