問題タブ [interop]
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 の CUDA?
PyCUDA などの多くの CUDA 言語バインディングがあることは知っていますが、.Net 用の適切なバインディングはありますか? 私が見たのはこれだけですが、他にもあるなら知りたいです。
c# - C# から FORTRAN DLL を呼び出す保護されたメモリ違反
FORTRAN コードからコンパイルされたレガシー dll を呼び出そうとしています。私は Interop を初めて使用しますが、それに関する記事をいくつか読んだことがあり、私の場合はかなり簡単なようです。
本当に呼び出したいメソッドには複雑なメソッド シグネチャがありますが、この単純な GetVersion メソッドを呼び出すことさえできず、保護されたメモリ違反が発生します。
ここに私の DllImport コードがあります:
FORTRAN コードは次のとおりです。
失敗した単体テストは次のとおりです。
エラーメッセージは次のとおりです。
私が試した他のこと:
- デフォルトのマーシャリングの使用
- 文字列の代わりに char[] を渡す (代わりにメソッド シグネチャ エラーを取得する)
c# - C# プロジェクトの設定「安全でないコードを許可する」の実際の機能とは
C# プロジェクト設定の [安全でないコードを許可する] がプロジェクト自体の安全でない C# コードにのみ適用されるのか、それともネイティブ C++ DLL でリンクするときにこのオプションを設定する必要があるのか疑問に思っていました。それ自体がネイティブ DLL にリンクするマネージ DLL 内でのリンクについてはどうでしょうか。このオプションは、内部で実際に何をするのでしょうか?
.net - .NET Interop を使用した Adobe Reader 9 でのプログラムによる印刷
VB.Net WinForms を使用しています。Adobe Reader 9 ActiveX コントロールを呼び出して PDF を印刷したいと考えています。ActiveX コントロールを VS ツールボックスに追加しました (dll は AcroPDF.dll、COM 名は「Adobe PDF Reader」です。いくつかの実験の後、次のコードが機能します。
Yuk ビットがないと、一部の PDF のみが印刷されます。印刷が完了する前に、End Using ステートメントがコントロールで dispose を呼び出しているようです。
したがって、printAll への呼び出しは非ブロッキングのようですが、印刷スプーリングが完了したかどうかを確認するために照会できるコールバックまたはステータス プロパティが見つかりません。プロパティ/メソッドがありませんか、それともより洗練された (そして応答性の高い) 回避策はありますか?
c# - C# と C++ 間の相互運用性に関する SQL CE 3.5 展開の問題
C# アプリケーションが SQL CE 3.5 で動作している状況があります。レガシ プログラムがその機能の一部を使用できるようにするために、相互運用機能を使用して C# プログラムから必要な情報を抽出する C++ dll を作成しました。これが機能するには、C# プログラムがデータベースにアクセスする必要があります。非常に複雑なシナリオではありません。
ただし、プライベート インストールで展開しようとすると、いくつかの問題が発生します。 C# プログラムに問題はありません。データベースにアクセスして、問題なく操作できます。
しかし、C# プログラムにデータベースへのアクセスを強制する C++ 相互運用機能を介して C# プログラムの関数にアクセスしようとすると、「...プロバイダー: System.Data.SqlServerCe.3.5 はインストールされていない"。
これは明らかに、実行中のプログラムに App.config ファイルを追加できないためです。
どうすればこれを回避できますか? これを修正する別の方法はありますか?他の形式の SQL CE 3.5 インストール方法は問題外です。したがって、これを機能させる必要があります。
よろしく、
P
編集:
私は SQL CE に対して直接取り組んでいませんが、Linq2SQL を通じて取り組んでいます。すべての dll に構成ファイルを追加しようとしましたが、役に立ちません。実行可能ファイルに app.config がある場合にのみ問題になるようです。
スローされた例外は、プロバイダー System.Data.SqlServerCe.3.5 がインストールされていません。
そして、スタック トレースに従って呼び出される最新の関数は System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Initialize(...) です。
編集 2
展開が機能するために必要なすべてのファイルを追加しました。上で書いたように、SQL CE 3.5 dll を検索する場所を指定する app.config ファイルを含む .net 実行可能ファイルを介して、プログラム dll (Linq 2 Sql を使用) を使用すると機能します。ファイルだけでは展開は機能しません。app.config ファイルが必要です。
問題は、Sql Ce 3.5 dll を探す場所を .net に伝える手段がない C++ 実行可能ファイルを介して dll ファイルを使用する必要があることです。
c# - Vista、Office 相互運用機能が動作しない
MS Office 2007 .NET C# Interop ライブラリを Vista で動作させる方法を知っている人はいますか?
Windows サービスとして実行するようにセットアップした .NET C# アプリケーションがあります。このプログラムは、状況に応じて Word または Excel のテンプレートを開き、その内容を変更してからドキュメントを保存します。Office 2007 を使用して Windows Server 2003 または XP マシンで実行していた場合、これらすべてがうまく機能しました。すべてを Server 2008 ボックスに移動すると、すべてが機能しなくなりました。たとえば、Excel では、ファイルが明らかにそこにあるときに Excel ファイルを開くことができないという COM 例外が発生し、手動で実行すると問題なく開くことができます。Windows サービスは、マシンにログインするのと同じユーザー アカウントで実行されており、そのアカウントは管理者です。
誰が何をすべきか考えていますか?
c# - COM 相互運用機能は、アセンブリの読み込みで .NET AppDomain 境界を尊重しますか?
核となる問題は次のとおりです。別の AppDomain でCOM 相互運用機能を使用する .NET アプリケーションがあります。COM スタッフは、COM スタッフが呼び出されている AppDomain ではなく、アセンブリをデフォルト ドメインにロードしているようです。
私が知りたいのは、これは予想される動作ですか、それとも、これらの COM 関連のアセンブリが間違った AppDomain に読み込まれるようにするために何か間違ったことをしているのですか? 以下の状況の詳細な説明を参照してください...
アプリケーションは 3 つのアセンブリで構成されています。 - アプリケーションのエントリ ポイントであるメイン EXE。- インターフェイス IController (IPlugin スタイル) のみを含む common.dll - IController および MarshalByRefObject を実装する Controller クラスを含む controller.dll。このクラスはすべての作業を行い、COM 相互運用機能を使用して別のアプリケーションと対話します。
メイン EXE の関連部分は次のようになります。
common.dll には、次の 2 つだけが含まれています。
そして、controller.dll には次のクラスが含まれています (COM 相互運用機能も呼び出します)。
アプリケーションを最初に実行すると、Assembly.GetAssemblies() は予想どおりに表示され、common.dll は両方の AppDomains に読み込まれ、controller.dll はコントローラー ドメインにのみ読み込まれます。ただし、c.Run() を呼び出した後、COM 相互運用機能に関連するアセンブリがデフォルトの AppDomain に読み込まれ、COM 相互運用が行われている AppDomain には読み込まれていないことがわかります。
なぜこれが起こっているのでしょうか?
興味がある場合は、ここに少し背景があります。
もともと、これは 1 AppDomain アプリケーションでした。それがインターフェースするCOMのものは、長期間使用すると安定しないサーバーAPIです。COM から COMException (その原因に関する有用な診断情報がない) が発生した場合、COM 接続が再び機能する前に、アプリケーション全体を再起動する必要があります。COM アプリケーション サーバーに再接続するだけで、再びすぐに COM 例外が発生します。これに対処するために、COM 相互運用機能を別の AppDomain に移動しようとしました。これにより、謎の COMExceptions が発生したときに、それが発生した AppDomain をアンロードし、新しいものを作成して、アプリケーションを手動で再起動することなく、最初からやり直すことができます。 . とにかくそれが理論でした...
c# - .NET相互運用機能:現在のディレクトリのアセンブリを使用する
VB6からの.NETアセンブリを、GACに配置せずに、またregasm.exeの/ codebase引数を使用せずに、相互運用機能を介して使用しようとしています。
私が理解していることから、.NETクラスライブラリでregasm.exeを実行すると、クラスライブラリ内の各クラスのレジストリエントリが作成され、COMクライアントに.NETオブジェクトをラップするプロキシとして機能するmscoree.dllをロードするように指示されます。 COMの使用。Mscoree.dllは、クラスのレジストリ内のInprocServer32 / Assemblyキーを使用して、クラスの実装が含まれているクラスライブラリを判別します。
regasm.exeで/codebaseを使用するか、クラスライブラリをGACに配置すると、すべてが正常に機能します。しかし、散在するドキュメントから理解できる限り、mscoree.dllは、現在のディレクトリと、/ codebaseが使用されていない場合はパスでアセンブリを探す必要があります(したがって、レジストリにCodeBaseエントリがありません。クラス)そしてそれはGACでそれを見つけることができません。
C#コードは、次のように単純です。
そして、問題は、コンパイルされたDLLと同じディレクトリに置いたVBScript1ライナーで再現されます。
ここで何が欠けていますか?mscoree.dllがどこかでアセンブリを検索する方法の明確な説明はありますか?
ところで、私は.NET 2.0を使用していますが、そうです、アセンブリをGACに配置する必要があることはわかっています。なぜ、これが宣伝どおりに機能しないのか疑問に思っています。
c# - C++ から C# dll を呼び出すときに app.config ファイルを使用する方法
app.config
C++ から .Net dll を呼び出すときに .Net 部分のファイルを使用するにはどうすればよいですか。.Net ランタイムの起動時に構成ファイル内のデータを読み取る必要があります。
foo.dll.config
呼び出し元の を使用すると、ConfigurationManager.OpenExeConfiguration("foo.dll")
アプリケーション設定にアクセスできます。私がやりたいことは、 の一部の情報を変更することです<system.data>
。つまり、 a を削除DbProviderFactory
して新しいものに置き換えます。
これは、コードが exectubalesapp.config
ファイルに配置されている場合にのみ実行できるようです。
しかし、C++ から .Net コードを呼び出しているため、実行可能ファイルの app.config を使用できません。
machine.config
C++ を介して .Net dll を呼び出しているにもかかわらず、.Net ランタイムが開始された直後に確実に実行される構成ファイルを指定する方法はありますか?
java - JSP ページから COM オブジェクトをロードするにはどうすればよいですか?
JSP アプリケーションを開発していて、COM オブジェクトをロードする必要があります。そのようなことができるでしょうか?
はいの場合、どのように?