問題タブ [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.
.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 の終了時に欠けているものはありますか? はいの場合、そのようなイベントを処理する適切な方法は何ですか?
前もって感謝します。
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 とのインターフェース