問題タブ [side-by-side]
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.
.net - SxS を使用し、マニフェスト ファイルが使用されている場合、.net 呼び出し COM は他の .net COM オブジェクトを呼び出しますか?
COM コンポーネント (C++) を呼び出す .net アプリケーションがあり、.NET で実装された別の COM オブジェクトを呼び出します。
このアプリケーションは Windows SxS 機能を使用しており、COM コンポーネントを登録していません。C++ で書かれたものでも、.net で書かれたものでもありません。
C++ COM コンポーネントへのこの最初の呼び出しは正常に機能します。しかし、C++ COM コンポーネントが .net コンポーネントを呼び出すと、クラスが登録されていないため失敗します。
.net コンポーネントを呼び出すマニフェスト ファイルを使用して小さな C++ アプリを作成しようとしましたが、動作します。流れが.net→COM NATIVE→.NET COMのときのようです。するとSxSが壊れて動かなくなります。
Fusion ログ (アセンブリの読み込みログ) を見ると、誰も .NET COM アセンブリを解決しようとしていないことがわかります。
この SxS シナリオは動作するはずですか (動作するはずだと思います)? はいの場合、何が間違っているのでしょうか?
これらは私が使用しているマニフェスト ファイルです。
.net アプリケーションのアプリ マニフェスト (リソースとして埋め込まれています):
application.sxs.manifest (通常のファイル):
PerformanceMonitor マニフェスト (XP の .net com バグを回避するために、PerformanceMonitor.dll にリソースとして埋め込まれています):
.net-4.0 - .NET4サイドバイサイド問題
ホストプログラムが.NET4でコンパイルされているが、参照されるdllが.net3.5である場合。次に、ターゲットデプロイマシンは.net4フレームワークと.net3.5フレームワークランタイムの両方をインストールする必要がありますか?
visual-studio - マニフェストを使用して、バージョンを指定せずにCOMサーバーを使用できますか?
私たちのプログラムのうちの2つは、同じクラスIDを持つ同じCOMサーバー(これも私たちが作成したもの)を使用しています。インストール時に各プログラムは、COMサーバーファイルをそのフォルダーにコピーし、COMサーバーにコピーしregsvr32
ます。
問題は、COMサーバーをインストールして、ユーザーがプログラムのいずれかまたは両方を異なるフォルダーに任意の順序で、場合によっては異なるバージョンでインストールできるようにする方法です。明らかに、クラスIDを変更せずにそれは不可能であり、それは構成に多くの面倒です。理想的には、そのためにマニフェストを使用し、なしで使用したいと思いregsvr32
ます。
問題は、reg-free COM(たとえば、ここ)について読むたびに、にversion
属性があることassemblyIdentity
です。バージョン番号はビルドごとに変更する必要があり、(自動的に)調整するというアイデアはまったく好きではありません。特定のバージョンへの依存関係を指定することが良い理由は理解できますが、このシナリオではまったく役に立ちません。
COMサーバーとコンシューマーの両方のマニフェストを記述して、バージョンを指定せず、フォルダー内にあるファイルのバージョンを操作する方法はありますか?また、検索をコンシューマーと同じフォルダーに制限する方法はありますか?
visual-studio - マニフェストを使用して、COMサーバーへのオプションの依存関係を指定できますか?
マニフェストを使用して、COMサーバー( reg-free COM )への依存関係を指定したいと思います。
コンシューマーアプリケーションは、COMサーバーがなくてもほとんど正常に動作します。その機能の1.7%程度だけがCOMサーバーを使用します。したがって、昔ながらのregsvr32
方法では、ユーザーが呼び出しをトリガーする何かを実行しCoCreateInstance()
、その時点でコンシューマーにエラーメッセージが表示されるまで、正常に起動して動作します。
マニフェストをしばらく試してみましたが、依存しているCOMサーバーアセンブリがファイルシステムに存在しない限り、コンシューマーは起動しないようです。それは良くないね。
次の内容の「追加マニフェスト」を追加しました。
マニフェストでreg-freeCOMを使用し、依存関係をオプションにする方法はありますか?これにより、コンシューマープログラムが起動し、CoCreateInstance()
実際に呼び出されるまで正常に動作しますか?
windows - reg-free COM コンポーネントの消費のために CoCreateInstance() の代わりに LoadLibraryEx() を使用することの欠点はありますか?
私たちのプログラムは、同じく私たちが作成した COM サーバーを使用する必要があります。シナリオは次のとおりです。インストーラーは、プログラム ファイルと COM サーバー ファイルの両方を、インストールごとに同じフォルダーにコピーします。
現在、regsvr32 を使用して COM サーバーを登録していますが、これはあまり良くありません。同じ COM サーバー (別のバージョンの可能性が高い) を使用する別の無関係なプログラムを開発すると、問題が発生する可能性があります。CLSID が変更されていないため、サーバーは後で登録されたプログラムは両方のプログラムで使用され、最初のプログラムが誤動作する可能性があります。
したがって、reg-free COM が必要です。マニフェストを使用することもできますが、しばらく使ってみたところ、ナイトリー ビルドで使用するにはあまり便利ではありませんでした。プログラムを書き換えて、 を呼び出す代わりに を呼び出しCoCreateInstance()
てから、クラス ファクトリを見つけて取得し、それLoadLibraryEx()
を使用するようにすることもできます。GetProcAddress()
DllGetClassObject()
いくつかの欠点がすぐにわかります。
- プログラムは、正確な COM サーバー ファイル名に依存します。
- 通常は Windows で管理されるものについては、追加のコードを記述する必要があります。
- COM サーバーはインプロセスである必要があり、マーシャリングは使用されません。
これらの欠点は、一般的にショー ストッパーになる可能性がありますが、特定のシナリオではまったく悪くはありません。
と比較してLoadLibraryEx()
/を使用することで他に欠点はありますか?DllGetClassObject()
CoCreateInstance()
f# - FSharp.Compiler.CodeDomforVS2008およびVS2010を並べて
FSharp.Compiler.CodeDom(PowerPackから)を使用して、F#クラスを動的に作成しています。問題は、コンピューターにVS2008とVS2010の両方が並んでいて(正常に動作する)、この構成でF#を使用するのはせいぜいバグがあることです。
- InstallFSharp.msiをインストールしない場合、VS2008では、ビルドされたクラスがFSharp.Coreが見つからないことについて文句を言います(参照されている場合でも)
InstallFSharp.msiをインストールすると、VS2008では、ビルドされたクラスはVS2010用にビルドされたF#を使用し、.net4バリアントをロードするため、バイナリ非互換性例外をスローします。
FSC:エラーFS0219:参照またはデフォルトのベースCLIライブラリ'mscorlib'は、参照されているF#コアライブラリ' C:\ Program Files(x86)\ Microsoft F#\ v4.0\FSharp.Core.dll'とバイナリ互換性がありません。ライブラリを再コンパイルするか、使用しているCLIバージョンと一致するこのライブラリのバージョンへの明示的な参照を作成することを検討してください。
以前の場所で見つかったF#を個別にインストールされたdll-sに置き換えると、もちろんVS2010はバイナリの非互換性について文句を言います
私は何かを見落としているのでしょうか、それともこのような共有環境では機能しないのでしょうか。これは、アプリケーションをデプロイするときに実際の問題を意味する場合があります。
ありがとう
c++ - x64バージョンのWindowsServer2008を使用してアプリケーションが実行されないのはなぜですか?
数百台の貸衣装マシンにインストールされている少数のサードパーティDLLを使用するWin32C++アプリケーションがあります。最近、Windows XP、Windows Vista x64、Windows 7 x86、およびWindows Server2008x86でx86バージョンのインストールを正常にテストしました。問題はありません。インストーラー(nullsoft)は、VC2005とVC2008の再配布可能なファイルをインストールします。どちらも、使用する異なるDLLで必要になるためです。
ただし、Windows Server 2008 x64の両方で、x86バージョンとx64バージョンは起動を拒否します。プログラムのx86バージョンを起動すると、ダイアログが表示されます。
EventLogには次のメッセージが含まれています。
\ Windows\winsxsにはディレクトリが含まれています
sxstrace(最初のトレース、次に解析)を使用して、読み取り不可能な文字を含む3バイト長のログファイルが作成されます。x64バージョンの動作も同様です。また、サードパーティDLLのすべてのデモプログラムが正しく機能しています。ヒントはありますか?
assemblies - 実行可能ファイルの assemblyIdentity を変更するには?
.exe ファイルの作成に使用したツールを非表示にしたい。私は違法なことはしていません。自分の知的財産がコピーされるのを防ぎたいだけです。テキスト エディターで exe ファイルを開くと、次のセクションが表示されます。
名前を次のように変更しようとしました。
name="Microsoft.Windows.SomeOtherName"
これにより、ファイルを実行しようとすると、次のメッセージが表示されました。「このアプリケーションは、サイド バイ サイド構成が正しくないため、開始できませんでした。」
どうすればこれを解決できますか?
.net - .NET1.1オブジェクトと.NET2.0COMオブジェクトが同じプロセスで使用されている場合はどうなりますか?
プロセスが.NET1.1COMオブジェクトと.NET2.0COMオブジェクトの両方を、両方ともインプロセスサーバーを使用してロードする場合、どうなりますか?この構成で何か問題がありますか?または、オブジェクトの1つをアウトプロセスサーバーにする方が安全でしょうか?
.net-3.5 - .NET 3.5 ランタイムと .NET 4 ランタイムの互換性
.NET 4 で構築されたプラグインを使用して、.NET 3.5 で構築されたアプリケーションを実行することは可能ですか?