問題タブ [createinstance]
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.
c# - Assembly.CreateInstance を介して読み込まれる C# プラグインに引数を渡すにはどうすればよいですか?
私が今持っているもの(プラグインを正常にロードする)はこれです:
これは、引数のないコンストラクターを持つクラスに対してのみ機能します。コンストラクターに引数を渡すにはどうすればよいですか?
com - CLSIDFromProgID は成功しますが、CreateInstace は失敗します! なんで?
COM オブジェクトのインスタンスを作成しようとしています。インターフェイスを実装するクラス名があり、CLSIDFromProgID() を使用して CLSID を取得します。だから私はCLSIDを取得しているので、これからはすべてがうまくいくはずだと思っていました. ただし、CreateInstance を呼び出して CLSID を渡すと、「クラスが登録されていません」というエラーが表示されます。また、一部のコンピューターでのみこのエラーが発生します。複数のコンピューターでエラーなしで実行されます。問題がどこにあるのかわかりません。レジストリが汚れていますか? ここで何が起こっているか知っている人はいますか?ご協力いただきありがとうございます!
これが .NET COM クラスであることを付け加えたいと思います。適切なエントリはレジストリにあり、DLL は GAC にあります。
c++ - C++ DLL で COM 経由で呼び出す C# クラスを条件付きで選択するにはどうすればよいですか?
すべての StackOverFlow 兄弟の助けを借りて、COM 経由で C# クラスを呼び出し、データを外部アプリケーションとやり取りする C++ DLL を作成することができました。そのコードが機能し始めた後、王国では多くのお祝いがありました。
今、私は新しい問題を抱えています。DLL を拡張して、さまざまなクラスを呼び出せるようにしています (すべて同じインターフェイスを実装しています)。ロード時に DLL に渡される char 配列に応じて、呼び出すクラスを決定する必要があります。呼び出すメソッドは、使用するクラスに関係なくまったく同じです。DLL を呼び出すときにクラスを切り替える最良の方法は何ですか?
これはおそらくかなり単純な質問ですが、私は C++ をまったく知りません。COM を動かすことだけが、私にとって大きな挑戦でした。
編集:これを達成するための非常にエレガントな方法がいくつかあると確信しています(反射?)が、提案を簡単に実装できるものに限定してください....ここでは効率は重要ではなく、保守性は実際には問題ではありません。
c# - AppDomain を使用して DLL 内のクラスをインスタンス化する
私は、ユーザーの要求に応じてオンザフライでクラスをコンパイルし、Web サイトのサブディレクトリに dll (Equation.dll という名前) を配置する Web サイトを持っています。管理者はいつでも再コンパイルできます。ただし、クラスのインスタンスが作成されると、「別のプロセスによって使用されているため、プロセスはファイルにアクセスできません」というメッセージが表示されます。
私が理解しているように、これを回避する唯一の方法は、別の AppDomain からインスタンスを作成することです。次に管理者が再コンパイルする必要があるときは、この AppDomain をアンロードする必要があります。(私が思うに) すべて問題ありません。(もしかして私の推測が間違っているのでしょうか?)
率直に言って、命を救うためにこのクラスのインスタンスを作成することはできません。確かに、私はここで少し頭を悩ませています...だから私は何でもスイングしています。この時点での私のスニペットは次のとおりです。
「equationcache」フォルダーは、dll がコンパイルされる場所です (これを楽しみのために「bin」に配置しようとしましたが、どちらも成功しませんでした)。呼び出しのアセンブリ名は正しいようです (そして appDomain.Load で動作します)。呼び出しの型名は正しいようです。ログによると、次のことが起こります。
「equationcache」ディレクトリでさまざまな形式の「Cnn.CostModel」を探している理由がわかりません。確かに、呼び出しコードは bin フォルダーの "Cnn.CostModel.dll" にあります。代わりに「Equation.dll」ファイルを取得するにはどうすればよいですか?
それとも、私はこの努力に完全に基づいていませんか? 非常にイライラします。どんな助けでも大歓迎です。
c# - 型指定されたデータセットを動的に定義しますか?
実行時にコードで型指定されたデータセットのインスタンスを動的に作成しようとしています。私は利用可能なタイプを持っていますが、これをしようとすると:
問題は、コードを実行しようとすると、型が有効ではないように見えることです。ここで何が間違っているのでしょうか?
c# - Activator.CreateInstance(t、42、args)がコンストラクターを見つけることができません
ファクトリパターンスタイルの関数で次のコード(のわずかに拡張されたバージョン)を使用しています:
p>ただし、実行時にconstuctor not found例外がスローされるため、理由がわかりません。
data.Case.ToString()メソッドは、単一の引数を取るコンストラクターを持つクラスの名前SingleItemNewを返します。
誰かが問題が何であるかを知っていますか?
乾杯、エド
.net - Activator.CreateInstanceでctorargsを渡す方法、またはILを使用する方法は?
パフォーマンスが強化されたActivator.CreateInstance()が必要で、ファクトリを使用してILでインスタンスを作成し、それをキャッシュするMironAbramsonによるこの記事に出くわしました。(どういうわけか消えた場合に備えて、Miron Abramsonのサイトから以下のコードを含めました)。私はILEmitコードと、クラスをインスタンス化するためのActivator.CreateInstance()以外のものに不慣れであり、どんな助けでも大いに感謝するでしょう。
私の問題は、パラメーターを持つctorを受け取るオブジェクトのインスタンスを作成する必要があることです。パラメーターのタイプを渡す方法があるようですが、ctorパラメーターの値も渡す方法はありますか?
可能であれば、CreateObjectFactory<T>(params object[] constructorParams)
インスタンス化する一部のオブジェクトに複数のctorパラメーターがある可能性があるのと同様のメソッドを使用したいと思います。
c# - 別の AppDomain 内の Type の CreateInstance
私のシナリオは、AppDomains を作成する .net アプリケーション (コンソール アプリとしましょう) があるというものです。次に、インスタンスを作成し、その AppDomain にある型でメソッドを呼び出す必要があります。各 AppDomain には、依存関係があるべき特定のディレクトリがあります。これは、コンソール アプリ ディレクトリの下 (または近く) ではありません。これが私の簡単なコードです:
CreateInstanceFrom を呼び出すと、FileNotFoundExcepotion が発生します。FusionLog は、検索したディレクトリがコンソール アプリケーション ディレクトリであったことを示しています。「baseDirecory」変数に、AppDomain から設定された検索フォルダーは含まれていませんでした。
私は何を間違っていますか?別の AppDomain にあるコードを実行する別の方法はありますか?
ありがとう...
.net - Winforms、.netでGetCreateInstanceSupported = trueの場合でもプロパティを読み取り専用としてマークする方法
TypeConverter クラスの CreateInstance メソッドを使用すると、フォントなどの不変オブジェクトのプロパティを編集できます。
ただし、フォント クラスとは異なり、私のクラスには、CreateInstance がサポートされていても、参照可能で読み取り専用にしたいプロパティがいくつかあります。
これをサポートする属性はありますか?
ETA: 以下の質問に回答しました。ただし、誰かにアイデアがあれば、まだわずかな改善の余地があります。
.net - AppDomain.CreateInstanceがルールに従っていません
ランタイムがアセンブリを見つける方法によると、ステップ2は以前に参照されたアセンブリをチェックしています。
ただし、以下のコードでは、これが確実に発生していないことがわかります。最初の行で、アセンブリがロードされます(これにより、今後のすべての呼び出しで「以前に参照されたアセンブリ」になります)。
ただし、数行後、コードがAppDomain.CurrentDomain.CreateInstanceを呼び出すと、AssemblyResolveイベントが発生し、ランタイムが要求されたアセンブリを見つけることができないことを示します。
AssemblyResolveイベントから、CurrentDomain.GetAssemblies()から直接アセンブリを返しているため、アセンブリがロードされていることがわかります。
したがって、明らかな質問は、「ランタイムがアセンブリを見つける方法」のステップ2が意味するように、ランタイムが参照されたアセンブリを見つけられないのはなぜですか?
この例を実行するには、次のようにします。新しいコンソールアプリを作成し、そのソリューションに新しいClassLibraryを追加して、ClassLibrary1という名前のままにします。以下のコードをコンソールアプリケーションのクラスプログラムに貼り付けます。
次に、次のような参照を使用して追加します。
ステップ4のようにランタイムがアセンブリを見つけられないように、ここに元のパスを意図的に残していることに注意してください。コードベースまたはプロービングによるアセンブリの検索シナリオは、ステップ2で定義された機能を意図的に使用しようとしているようなものです。 。ランタイムがステップ4を介してパスを見つけることができる場合、それは正しく機能します。動作していないのはステップ2です。
ありがとう。