問題タブ [regfreecom]
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-interop - DLLを実行可能ファイルと同じディレクトリにコピーせずにCOMを登録する
dll を実行可能ファイルと同じディレクトリにコピーせずに、登録不要の COM オブジェクトを使用するにはどうすればよいですか? これは可能ですか?
完全な作業サンプルまたは正確なシナリオの詳細なステップバイステップ ガイドが必要です。
たとえば、次のコンポーネントがあります。
CppTestRunner.exe - vc++ コンソール アプリケーション
CppTests.dll - vc++ mfc dll
CsCOMServer.dll - c# COM 可視 dll
外部マニフェストを追加するなど、exe またはそのディレクトリを変更したくありません。
CppTests.dll は、exe とは別のディレクトリにあります。
CsCOMServer.dll は CppTests.dll と同じディレクトリにあれば問題ありません。
CppTestRunner.exe は、正常に動作する CppTests.dll で LoadLibrary を呼び出します。
マニフェストを埋め込み、Windows アクティベーション コンテキスト API を使用した後、CsCOMServer.dll を exe ディレクトリにコピーして、CppTests.dll が CsCOMServer.dll のインスタンスを問題なく作成できることを確認できましたが、この手順を回避しようとしています。 .
現在、CppTests.dll と同じディレクトリに CsCOMServer.dll があり、exe ディレクトリに CsCOMServer.dll がない場合、CoCreateInstance を呼び出すと次のエラーが発生します。
エラー = 0x80070002 指定されたファイルが見つかりません。
sysinternals プロセス モニターを使用して、CppTestRunner.exe が検索するパスなどを追跡しました。
実行しようとしている操作によっては、CppTestRunner.exe が CppTests と同じディレクトリにある CsCOMServer.dll.config を読み取ろうとすることがあります。 dllに何を入れようとしても、エラーを乗り越えることができませんでした。
また、私がやろうとしている他のことにもよりますが、CppTestRunner.exe は CppTests.dll と同じディレクトリにある CsCOMServer.dll を読み込もうとしますが、何らかの理由で同じエラーが発生します。
この正確なシナリオで動作するコードを知っている人はいますか?
おそらくおわかりのように、これはいくつかのユニット\統合テストの一部です。
簡単な回避策として、現在 CppTestRunner.exe を CppTests.dll と同じディレクトリにコピーし、そこから実行していますが、この手順は避けたいと考えています。
ありがとうございました。
com - レジストリフリーCOMをデバッグする方法は?
いくつかのサードパーティのCOMコンポーネントをラップするという厄介な状況があります。実際には、1つのCOMコンポーネントと複数の.NETアセンブリです。.NETアセンブリは、同じサードパーティの内部COMコンポーネントに依存します。COM DLLを登録すると、コードは正常に機能します(現在、C#からテストしています)。そうしないと失敗します。それをデバッグするための最良の方法は何ですか?
COMコンポーネントへの参照を追加し、Isolated = trueを設定して、結果のcomClass要素をマニフェストから自分のSxSマニフェストに抽出することにより、SxSマニフェストを生成しました。また、Interop.XXX.dllファイルを作成しているようです:それは何のためですか?
エラーメッセージの例:
vba - Excel から ocx 依存関係を持つ RegFree COM vb6 dll を呼び出す
MMM を使用してマニフェスト ファイルを生成し、VB6.exe クライアントを介して OCX 依存関係を持つ VB6 DLL を呼び出しましたが、これはターゲット マシンで Reg-Free で正常に動作します。
マニフェスト ファイルの抜粋は以下のとおりで、VB6 MS Chart コントロールの依存関係 (MSCHRT20.ocx) を示しています。
Windows 7 で Windows.ActCtx オブジェクトを使用して、この作業を Excel で Reg-Free にしたいと考えています。.ocx 依存関係のない単純なテスト用の HelloWorld VB6 dll を使用するだけの場合、これはターゲット マシン上の Excel 2010 で正常に動作します。
私が使用したテストマニフェストファイルについては、以下を参照してください
ただし、ocx 依存関係を持つ完全な dll で同じ手法を試すと、ターゲット マシンでエラー コード 339 (ocx 依存関係が見つかりません) が表示されます。
すべてのファイルは、XCOPY 展開用の 1 つのフォルダーにあります。
要約すると、VB6 クライアントでは正常に動作しますが、VBA / ActCtx クライアントでは動作しません。これが機能しない理由はありますか?
ありがとうデビッド
c# - 登録 EXE での無料 COM エラー
EXE によって公開された COM 関数を使用しようとしています。Visual Studio 2010 (windows7/x64 マシン上) を使用して C# プロジェクトを作成し、その EXE への参照を追加してから、Isolated フラグを true に設定しました。ソリューションをビルドすると、公開するクラスごとにエラーが発生します。
COM 参照 'FNCClient11Lib' を分離する際の問題: レジストリ キー 'HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID{e49b30c9-6d7e-48f5-91da-f2f0414c6a13}\InProcServer32' に値 '(Default)' がありません。
これらのエントリはレジストリのその場所には存在しませんが、ここには存在します (以下)。
HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID{E49B30C9-6D7E-48F5-91DA-F2F0414C6A13}
- ビルド時にこれをレジストリの正しい場所に向ける方法はありますか?
- EXE を参照できますか? これまで見てきたすべての例は、DLL のみを参照しています。
c# - .ocxファイルからActiveXコントロールを動的にインスタンス化するにはどうすればよいですか?
ActiveXコントロールのインスタンスを作成したいと思います。C#の.ocxファイルとインターフェイス定義を考えると、どうすればこれを行うことができますか?ターゲットシステムにコントロールをグローバルに登録する必要がないようにしたいので、プロジェクトへの参照を追加する通常の方法を意味するものではありません。
asp.net - ASP.NET からの登録不要の COM?
Windows では、COM dll を登録しなくてもCOM オブジェクトを使用できます。
このメカニズムは、アプリケーションのマニフェストに「依存アセンブリ」を含めることです。
MyProgram.exe.manifest
そして、あなたのフォルダには以下が含まれています:
MyProgram.exe
MyProgram.exe.manifest
RT_MANIFEST
(外部マニフェストを使用している場合。リソースに埋め込むこともできます)Contoso.Frobber.manifest
(COM DLL マニフェスト)confrob.dll
(使用する COM クラスを含む dll)
以下を含む COM dll のアセンブリ マニフェストを使用します。
Contoso.Frobber.manifest
優秀な。COM オブジェクトを登録しなくても、(ネイティブまたは .NET) 実行可能ファイルから COM オブジェクトを使用できるようになりました。
COM オブジェクトを登録せずに、ASP.NET Web サイトから COM オブジェクトを使用したいと考えています。
可能?
ボーナスおしゃべり
Windows では、.NET アセンブリを Global Assembly Cache にインストールしなくても、exe で .NET ライブラリを呼び出すこともできます。
c# - dot net で登録不要の COM dll を使用する方法
私のプロジェクトの 1 つに、C++ DLL を使用する c# アプリケーションがあります。現在、クライアント PC では、C# で使用できるように、C++ DLL を COM コンポーネントのレジストリに登録しています。
リンクhttp://msdn.microsoft.com/en-us/library/ms973913.aspxで、Microsoft から利用可能な Reg Free ソリューションがあることを NET で知りました。
しかし、読んだ後、私のアプリケーションアーキテクチャは次のように異なるため、あまり手がかりが得られませんでした
- CPForms.dll と Rules.dll の 2 つの C++ dll があります。
- Rule.dll は CPForms.dll 内に含まれています
- CPForms.DLL を使用している ConsumeForm.dll と言う C# dll が 1 つあります。
- ConsumeForm.dll を使用している別の C# Exe があります。
クライアントは C# Exe のみを開いており、ConsumeForm.dll を呼び出しています。これはさらに C++ フォーム (UI) を表示する CPForms.dll を呼び出しています。ユーザーが内部で C++ Rules.dll を使用してそのボタンをクリックすると、ボタンの検証があります。現在、両方の C++ dll をレジストリに登録しています。
Rule.dll は頻繁に変更され、管理者アカウントを使用して何度も登録を解除したり再登録したりしたくないため、クライアントは Rule.dll を RegFree インストールとして参照することだけを望んでいます。
それ以外の場合、そのクライアントは CPForms.dll の登録で問題ありません。
私の質問は、マニフェスト ファイルを生成する方法です。そして、それは私のシナリオでどのように機能しますか?
c# - ブラウザでActiveXコントロールとして実行されているアセンブリで登録なしのCOMを使用することは可能ですか?
私はしばらくの間これに夢中になっていて、私がやろうとしていることは不可能であるという結論に近づいていますが、Stack Overflowの人々に、うまくいけば私が間違っていることを証明する機会を与えてから、別の戦略。
私がやろうとしていること 私のプロジェクトは、ブラウザで実行することを目的としたActiveXコントロール(コントロールA)としてCOMに公開される.NETアセンブリです。コントロールAからRegistrationFreeCOMを介して使用しようとしているサードパーティのActiveXコントロール(コントロールB)に依存しています。
したがって、目的のスタックは次のようになります。
Internet Explorer
[COM]
Axe Control A(My Control)
[Reg-Free COM]
Axe Control B(サードパーティ)
これを実行しようとしている 理由コントロールBを使用する別のアプリケーションとのバージョンの競合があり、コントロールBがバージョン管理を正しく実装しなかった(同じGUIDを持つ2つの非互換バージョンが存在する)ため、登録なしのCOMを使用したいと思います。登録不要のCOMは、コントロールBの2つのバージョンを互いに分離するための唯一の実行可能な方法のようです。
ブラウザーが登録不要のCOMを介してコントロール(コントロールA)を呼び出す必要はありません。通常のメカニズムを使用することを計画しました。
私がこれまでに行ったこと ブラウザがこのスタック全体を実行する究極のアプリケーションであり、ユーザーにInternet Explorerのマニフェストファイルを追加させることは実用的または推奨されないことを考えると、私のアプローチはコントロールAにマニフェストして、登録不要のCOMを使用してコントロールBを呼び出すようにします。
マニフェストをコントロールAに埋め込むことができ、サードパーティのツールを使用して、マニフェストが実際に埋め込まれていることを確認しました。テストのために物事を単純化するために、私はブラウザーを方程式から外し、単純なC#フォームアプリケーションから登録不要のCOMをテストしてきました。ただし、その環境では登録不要のCOMを動作させることができないようです。
テストの目的で、コントロールAに埋め込んだ情報を使用して、テストフォームアプリケーションのマニフェストを作成しました。その構成では、コントロールBが登録されているかどうかに関係なく機能します。私のアプリケーションがブラウザではなくそのテストアプリケーションで実行される場合、これは素晴らしいことです。このテストは、埋め込んだマニフェストが正しいことを確認するためだけに行いました。これは確認済みだと思います。
動作しない意味 テストWindowsフォームアプリケーションは完全に実行され、コントロールBが登録されている間、コントロールAと(ネストされた)コントロールBが表示されます。ただし、コントロールBの登録を解除し、登録のないCOMに依存しようとすると、アプリケーションはすぐに次のエラーをスローします(UFV =コントロールA)。
私の質問
(1)間違った木を吠えていますか?つまり、私が試みているように、スタックの途中で登録なしのCOMを使用することも可能ですか、それともマニフェストをEXEファイル自体(またはマニフェストファイル)に埋め込む必要がありますか?
(2)これが不可能な場合、マニフェストマージツール(MT.EXE)でマニフェストをDLLファイルに埋め込むことができるのはなぜですか?
(3)可能であれば、どこかで足りないのですか?これを行うためのトリックはありますか?
c# - c# dll と vc++ dll では、COM dll の登録不要のアクティベーションがどのように異なるのですか?
私は、COM dll の登録不要のアクティベーションを初めて行いました。数日前、C# アプリケーション内の Reg free に関する 1 つの質問を投稿し、正常に完了しました。
今楽しみにしています次のように2つの異なる要件があります
- C# dll (classlibrary プロジェクト) 内で COM dll の登録不要のアクティベーションを使用できますか?
- VC++ dll プロジェクトで COM dll の登録不要のアクティベーションを使用できますか?
c# dll と vc++ dll 内で登録不要の COM の実装に違いはありますか? 私はC#ウィンドウアプリケーションで行ったので、COMのIsolatedプロパティをtrueに設定しただけで、自動的にVSがCOM dllに関してアプリケーションのマニフェストを生成しました
開発マシンで VS2010 を使用しています。
.net - VBA からではなく、C# から動作する RegFree COM
私は現在、Excel をクライアントとして、.NET dll をサーバーとして、登録不要の COM を動作させようとしています。現在、概念実証を機能させようとしているだけですが、問題が発生しています。
明らかに、私はExcelを使用しているため、実行可能ファイルと一緒にクライアントマニフェストを単純に使用することはできないため、Microsoft.Windows.ActCtx
(リンク)を使用しています
クライアント マニフェスト、アセンブリ マニフェスト、および dll はすべて同じ場所にあります。
残念ながら、C# で機能するものは Excel / VBA では機能しないようで、その理由がわかりません。C# テスト クライアントは完全に動作しますが、VBA では80070002エラーが発生し、メッセージMethod 'CreateObject' of object 'IActCtx' failed が表示されます。
COMTestObject
次のように、単一のクラス/インターフェイスを COM ( / ) に公開する .NET dll (COMTestService.dll) がありICOMTestObject
ます。
クライアント マニフェスト (COMTestService_Client.manifest):
アセンブリ マニフェスト (COMTestService.manifest):
VBA クライアント コード:
C# クライアント コード:
編集
プロットが厚くなります...ちょっとした楽しみとして、C# でオブジェクトを作成するための簡単な COM 可視の REGISTERED ヘルパー クラスを作成し、次にpublic object CreateObject(string manifestPath, string typeName)
、C# exe からこれを呼び出すという行に沿ったメソッドを使用してそれを返します。問題はありませんが、VBA からの呼び出しは失敗します (80070002 再び、メッセージ: The system cannot find the file specified. )。今、私はさらに混乱しています...
ご協力いただきありがとうございます。さらに情報を提供する必要がある場合はお知らせください。喜んで対応させていただきます。