2017-12-13 9 views
0

埋め込み/参照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

答えて

0

Assembly.LoadFile方法のみ指定されたファイルをロードSystem.Reflection.ConstructorInfo.Invokeで (オブジェクト[]パラメータ)(のBindingFlags invokeAttr、バインダーバインダーは、[]パラメータ、CultureInfoカルチャオブジェクト)。あなたの場合、Assembly.LoadFromメソッドを使う必要があります。 Please check for differences between Assembly.LoadFile and Assembly.LoadFrom

LoadFrom()は、融合を通過し、一方が既にLoadFromコンテキストにロードされた場合、別のパスではなく、同じIDを使用して別のアセンブリにリダイレクトすることができます。

LoadFile()はFusionをまったくバインドしません。ローダは先に進み、呼び出し元が要求したものを正確にロードします。 LoadまたはLoadFromコンテキストは使用されません。

あなたの実行コードサンプルは

static void Main(string[] args) 
    { 
     var fileName = ""; //put here test.dll path 
     Assembly ass = Assembly.LoadFrom(fileName); 

     var type = ass.GetType("Test.Test"); 

     var test = Activator.CreateInstance(type); 
    } 
+0

ありがとう@nmkayaようになります。私もLoadFromメソッドで試しました。しかし、参照元のアセンブリ(User.dll)が別のパスにある場合、そのメソッドを呼び出さずに同じFileNotFound例外が発生するという問題があります。 したがって、**メソッドを呼び出す前に**プログラムで参照アセンブリ(例:User.dll)を実行可能なアプリケーションディレクトリ**にプログラムでコピーまたは移動するだけで回避できます。 (たとえば、Debug \ bin)。 –

+0

@ ramanan.javaの場合、User.dllはTest.dllの場所またはGacになければなりません。それ以外の場合、Test.dllはプロジェクト参照として追加されても機能しません(この場合、テストプロジェクトのアセンブリはメインアプリケーションの場所にもコピーされます)。 Test.dllの場所からUser.dllにアクセスできる場合は、Test.dllとUser.dllをコピーする必要はありません。テストアプリケーションでどのように動作するかを確認しましたが、状況によっては別の問題が発生している可能性があります。メインアプリケーションはユーザーを読み込めません。それは別のプロセスによってロックされているためです。 –

関連する問題