CodeFlowCodeFlowC#アプリケーションで使用するためのDllImportのパラメータ化105ハードウェアにアクセスするためのライブラリを提供するサプライヤがあります。残念ながら、あなたが複数のデバイスを持っている場合、あなたは異なるdll名でそれらのライブラリを複数回インポートする必要があります。結果として、私たちはメートルトンの重複したコードを持っています、そして私はそれがすぐにメンテナンスの悪夢になることを心配しています。現時点で私たちが持っているのはこんな感じです。}}CまたはCを使用していた場合は、1つのファイルに関数を定義して静的クラスに複数回含めるだけで済みますが、それよりも優れていますが、C#ではそのオプションはありません。必要なだけ多くの静的デバイスクラスを生成することを可能にするファクトリを効果的に定義する方法について誰かが巧妙なアイデアを持っているなら、私は非常に興味があるでしょう。編集:関数のプロトタイプはかなりバラエティに富んでいるので、それらを同じものに依存する方法は適していないでしょう。これまでのところ提案をありがとう、私はそれほど多くのアイデアをそれほど早く拡張していませんでした。Answer14いくつか考慮すべき点があります。代替#one編集:このアプローチはコンパイルされた方法を変更することを必要とし、それは困難でありそして注入、アセンブリ修正またはAOP-ランドで一般的に使用される他の方法を必要とする。以下の2つの方法を検討してください。[ここで説明する手法]関数のILを操作するには、ここでDllImport属性を変更できます等これらの関数のデリゲートを作成してあなたの呼び出しをキャッシュしてくださいデリゲートを返す代わりの#two:編集:この代替アプローチは最初は少し複雑に思われますが、誰かがすでにあなたのために仕事をしました。[この優れたCodeProjectの記事]を参照し、そのコードをダウンロードして使用し、DllImportスタイルのメソッドを動的に作成してください。基本的には、次のようになります。`MethodBuilder`を使ってあなたのためのメソッドを作成します。関数として使用できるそのメソッドへのデリゲートを返します。[DefinePInvokeMethod]を使う。1008849で提供されていますこのCodeProjectの記事]。各呼び出しのメソッド全体ラッパーからデリゲートを返します。この方法がコード内でどのように見えるかを説明します。返されたデリゲートを好きなだけ再利用できます。動的メソッドのコストのかかる構築は、メソッドごとに1回だけ行うべきです。編集:すべてのデリゲートと連携し、デリゲート署名からの正しい戻り値の型とパラメータの型を自動的に反映するようにコードサンプルを更新しました。このようにして、実装をシグネチャから完全に切り離しました。あなたの現在の状況を考えれば、私たちはこれを実行することができます。利点:型安全性と単一変更点があります。非常に簡単に管理できます。"kernel32.dll");Debug.WriteLine(getTickCount());他のアプローチも可能です、と私は思います(このスレッドで他の人によって言及されたテンプレート化アプローチのように)。3番目とさらに簡単な方法が追加されました。次の内容の.ttファイルを作成します。deviceName#>。Studioはこれを次のように変換します。System.Runtime.InteropServicesを使用します。`Marshal.GetDelegateForFunctionPointer`を呼び出すだけです。InvokeからDllNotFoundExceptionをキャッチします。"保護されたメモリを読み書きしようとしました。多くの場合、これは他のメモリが破損していることを示しています。