問題タブ [out-of-process]

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.

0 投票する
0 に答える
162 参照

.net - イベント処理を備えた .Net サービス コンポーネント

プロセス外の .Net DLL を作成しようとしています。サンプルコードを使用して、プロセス外の COM DLL を作成できました。ただし、イベント処理の実装中にいくつかの問題に直面しています。

コードに従って、次のイベントがコンポーネントによって公開されます。

VB.Net フォーム アプリケーションでそのイベントを処理すると、例外がスローされます。詳細は次のとおりです。

例外の詳細:

スタックトレース:

System.RuntimeMethodHandle.SerializationInvoke (IRuntimeMethodInfo メソッド、オブジェクト ターゲット、SerializationInfo 情報、StreamingContext& コンテキスト) で System.Runtime.Serialization.ObjectManager.CompleteISerializableObject (オブジェクト obj、SerializationInfo 情報、StreamingContext コンテキスト) で System.Runtime.Serialization.ObjectManager.FixupSpecialObject ( System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) at System.EnterpriseServices. System.EnterpriseServices の System.EnterpriseServices.ComponentServices.ConvertToMessage(String s、オブジェクト tp) の ComponentSerializer.UnmarshalFromBuffer(Byte[] b、オブジェクト tp)。System.EnterpriseServices.ServicedComponent.System.EnterpriseServices.IRemoteDispatch.RemoteDispatchNotAutoDone(String s) の ServicedComponent.RemoteDispatchHelper(String s, Boolean& failed) System.EnterpriseServices.IRemoteDispatch.RemoteDispatchNotAutoDone(String s) の System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(IMessage D:\Meridia\MeridiaAPI\COMPlusServices\TestApp の TestApp.modMain.Main() で\Module1.vb:34行目System.EnterpriseServices.IRemoteDispatch.RemoteDispatchNotAutoDone(String s) の System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(IMessage reqMsg) の RemoteDispatchNotAutoDone(String s) System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData、Int32 型) の VBServicedComponent .SimpleObject.add_FloatPropertyChanging(FloatPropertyChangingEventHandler obj) at TestApp.modMain.Main() in D:\Meridia\MeridiaAPI\COMPlusServices\TestApp\Module1.vb:line 34System.EnterpriseServices.IRemoteDispatch.RemoteDispatchNotAutoDone(String s) の System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(IMessage reqMsg) の RemoteDispatchNotAutoDone(String s) System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData、Int32 型) の VBServicedComponent .SimpleObject.add_FloatPropertyChanging(FloatPropertyChangingEventHandler obj) at TestApp.modMain.Main() in D:\Meridia\MeridiaAPI\COMPlusServices\TestApp\Module1.vb:line 34add_FloatPropertyChanging(FloatPropertyChangingEventHandler obj) at TestApp.modMain.Main() in D:\Meridia\MeridiaAPI\COMPlusServices\TestApp\Module1.vb:line 34add_FloatPropertyChanging(FloatPropertyChangingEventHandler obj) at TestApp.modMain.Main() in D:\Meridia\MeridiaAPI\COMPlusServices\TestApp\Module1.vb:line 34

内部例外:

スタックトレース:

System.Reflection.RuntimeAssembly._nLoad (AssemblyName fileName、Evidence assemblySecurity、RuntimeAssembly locationHint、StackCrawlMark& stackMark、IntPtr pPrivHostBinder、Boolean throwOnFileNotFound、Boolean forIntrospection、Boolean suppressSecurityChecks) で System.Reflection.RuntimeAssembly.InternalLoadAssemblyName (AssemblyName assemblyRef、Evidence assemblySecurity 、RuntimeAssembly reqAssembly、StackCrawlMark& stackMark、IntPtr pPrivHostBinder、Boolean throwOnFileNotFound、System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString、Evidence assemblySecurity、StackCrawlMark& stackMark、IntPtr pPrivHostBinder、Boolean forIntrospection) で System.Reflection.RuntimeAssembly.RuntimeAssembly.RuntimeAssembly.InternalLoad InternalLoad(String assemblyString, 証拠 assemblySecurity,System.Reflection.MemberInfoSerializationHolder..ctor(SerializationInfo 情報、StreamingContext コンテキスト) で System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString(String assemblyName) で System.Reflection.Assembly.Load(String assemblyString) で StackCrawlMark& stackMark、Boolean forIntrospection)

イベントの処理中に TestApp の終了時に欠けているものはありますか? はいの場合、そのようなイベントを処理する適切な方法は何ですか?

前もって感謝します。

0 投票する
1 に答える
3699 参照

c# - 64 ビット コードから 32 ビット DLL へのアクセス

64 ビット C# (および C++) アプリケーションで使用するには、32 ビット dll を移行する必要があります。dll はアンマネージ Delphi コードで記述されています。dll を再コンパイルできません。唯一の方法は、プロセス間通信 (IPC) を使用することです。長い間検索しましたが、多くの情報が見つかりませんでした。私が見つけた最良のガイドは、このリンクにあります: Accessing 32-bit DLLs from 64-bit code .

このフォーラムでは非常に頻繁に引用されているため、目標を達成するためにこのガイドに従いました。したがって、ガイドでは、次の 3 つの手順を実行する必要があると説明しています。

1° STEP - 32 ビット DLL をロードして呼び出す COM オブジェクトを実装する 32 ビット コンポーネントを作成し、32 ビット DLL インターフェイスを COM インターフェイスとして公開します。だから私はここで説明したのと同じことをしました(前のリンクから取られた例):

次に、.NET COM アセンブリを登録する必要があるため、Regasm.exe を使用する必要がありますが、代わりに、MSI ファイルをビルドして Regasm と同じことを行う Visual Studio のセットアップおよび展開プロジェクトを作成しました。次に、レジストリ エディターを制御し、HKEY を見つけて動作させました。したがって、このステップまではすべて問題ないか、問題ないように見えます。

2° STEP - この COM コンポーネントをアウト プロセス (OOP) 用に構成するには、標準の COM+ OOP アプリケーションを作成します (代理プロセスとして dllhost を使用)。

3° STEP - 元の 32 ビット DLL と同じインターフェイスを実装する 64 ビット ラッパー DLL を作成し、上で作成した COM オブジェクトの COM インターフェイスをインポートし、公開されたインターフェイスへの現在の呼び出しを COM オブジェクト インターフェイスへの呼び出しに変換します。呼び出しパラメーターを転送し、戻り値を受け取り、それらを呼び出し元に委任します。

問題は、2° と 3° の STEP を達成する方法がわからないことです。これについては、Web またはフォーラムで何も見つからないためです。したがって、ステップ 2° と 3° を達成するために助けが必要です。他の投稿などへのリンクもOKです。よろしくお願いします。


その他の情報 (2016 年 12 月 10 日 - 午後 11 時 10 分): この DLL は、次の 2 つのインターフェイスを介してその関数を 32 ビット ネイティブ環境に公開します。1.) 関数ポインターを含む C/C++ ヘッダー (WINAPI*) 2.) .NET P/Invoke とのインターフェース