埋め込み/参照DLLでC#Reflectionを使用してメソッドを呼び出す方法はありますか?C#を使用してメソッドを呼び出す際に別のDLLアセンブリを埋め込み/参照する方法Reflection
たとえば、以下のシナリオを考えてみましょう。 Iアセンブリコール基準として上記DLLを使用
namespace User
{
public class UserInfo
{
public static string Name = "Username";
}
}
ベローズとしてクラスを有するUSER.DLLを持って、私は、次のコードとアクセスUserInfo.Name変数をコンパイルすることができます。
using User;
using System.Windows.Forms;
public class Test
{
public Test()
{
MessageBox.Show("Name : " + UserInfo.Name);
}
}
は、上記のコードはTest.dllのアセンブリと呼ばれる別のDLLであることを検討してください。 Assembly.LoadFile( "Test.dll")とC#Reflectionを使用して、コンストラクタを呼び出そうとすると、ファイルが見つかりません。ランタイムエラーが発生しました。
エラー
System.Reflection.TargetInvocationException:呼び出しのターゲットが例外をスローされました。 ---> System.IO.FileNotFoundException:ファイルまたはアセンブリ 'DynamicAssembly、バージョン= 0.0.0.0、Culture = neutral、PublicKeyToken = null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。 System.RuntimeMethodHandle.InvokeMethodでTest..ctor() ---内部例外スタックトレースの終わり--- でSystem.Reflection.RuntimeConstructorInfoで (オブジェクト・ターゲット、[]引数、署名SIG、ブールコンストラクタオブジェクト) .Invoke
ありがとう@nmkayaようになります。私もLoadFromメソッドで試しました。しかし、参照元のアセンブリ(User.dll)が別のパスにある場合、そのメソッドを呼び出さずに同じFileNotFound例外が発生するという問題があります。 したがって、**メソッドを呼び出す前に**プログラムで参照アセンブリ(例:User.dll)を実行可能なアプリケーションディレクトリ**にプログラムでコピーまたは移動するだけで回避できます。 (たとえば、Debug \ bin)。 –
@ ramanan.javaの場合、User.dllはTest.dllの場所またはGacになければなりません。それ以外の場合、Test.dllはプロジェクト参照として追加されても機能しません(この場合、テストプロジェクトのアセンブリはメインアプリケーションの場所にもコピーされます)。 Test.dllの場所からUser.dllにアクセスできる場合は、Test.dllとUser.dllをコピーする必要はありません。テストアプリケーションでどのように動作するかを確認しましたが、状況によっては別の問題が発生している可能性があります。メインアプリケーションはユーザーを読み込めません。それは別のプロセスによってロックされているためです。 –