3

アプリケーションが既に起動された後で、.NET DLL からコードを実行できる方法を見つけようとしています。私がやろうとしていることを説明しようとする疑似コードを以下にいくつか含めました。私が想像しているよりも、おそらくはるかに複雑であることはわかっています。

ClassLibrary myLibrary = new ClassLibrary("C:\\Users\\Admin\\Desktop\\myTestLibrary.dll");
myLibrary.executeMethod("showMessageMethod", arg1, arg2, arg3...);

それが私がやりたいことですが、それよりもはるかに複雑になる可能性が高いことは理解しています!

また、プロジェクトなどでライブラリを参照することを意図していることを理解していることを明確にしたいと思いますが、私のプロジェクトでは、このようにしないことが必要です。

前もって感謝します!

4

5 に答える 5

13

次のように、アセンブリをディスクから読み込む必要があります。

Assembly myLibrary = System.Reflection.Assembly
    .LoadFile("C:\\Users\\Admin\\Desktop\\myTestLibrary.dll");

その後、リフレクションを使用して適切な型を取得し、適切なメソッドを呼び出す必要があります。呼び出したいクラスが、起動時に参照されるアセンブリで定義されているインターフェイスを実装している場合に最も便利です。

Type myClass = (
    from type in myLibrary.GetExportedTypes()
    where typeof(IMyInterface).IsAssignableFrom(type)
    select type)
    .Single();

var instance = (IMyInterface)Activator.CreateInstance(myClass);

instance.executeMethod("showMessageMethod", arg1, arg2, arg3...);
于 2012-10-04T08:34:08.370 に答える
3

次のコード例がお役に立てば幸いです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace zielonka.co.uk.stackoverflow.examples.Reflection
{
    class Program
    {
        static void Main(string[] args)
        {

            // dynamically load assembly from file Test.dll
            Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");


            // get type of class Calculator from just loaded assembly
            Type calcType = testAssembly.GetType("Test.Calculator");


            // create instance of class Calculator
            object calcInstance = Activator.CreateInstance(calcType);

            // get info about property: public double Number
            PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");

            // get value of property: public double Number
            double value = (double)numberPropertyInfo.GetValue(calcInstance, null);

            // set value of property: public double Number
            numberPropertyInfo.SetValue(calcInstance, 10.0, null);

            // get info about static property: public static double Pi
            PropertyInfo piPropertyInfo = calcType.GetProperty("Pi");

            // get value of static property: public static double Pi
            double piValue = (double)piPropertyInfo.GetValue(null, null);

            // invoke public instance method: public void Clear()
            calcType.InvokeMember("Clear",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
                null, calcInstance, null);

            // invoke private instance method: private void DoClear()
            calcType.InvokeMember("DoClear",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
                null, calcInstance, null);

            // invoke public instance method: public double Add(double number)
            double value = (double)calcType.InvokeMember("Add",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
                null, calcInstance, new object[] { 20.0 });

            // invoke public static method: public static double GetPi()
            double piValue = (double)calcType.InvokeMember("GetPi",
                BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
                null, null, null);


            // get value of private field: private double _number
            double value = (double)calcType.InvokeMember("_number",
                BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
                null, calcInstance, null);

        }
    }
}
于 2012-10-04T08:44:49.707 に答える
1

スティーブンの回答で詳述されているようにアセンブリをロードできますが、別の可能性があります。

ソリューションにアセンブリへの参照を追加しますが、アセンブリをソリューションの一部として展開しません。つまり、リフレクションを使用する必要はなく、代わりに AppDomain.AssemblyResolve イベントを使用します。

あなたのニーズは明確ではありませんが、基本的にこれは dll を注入する方法です。

たとえば、サポートする各バックエンドのデータベース操作を実装するための dll があるとします。

コードがアセンブリを見つけようとすると、通常の場所が検索されます。アセンブリがロードされておらず見つからない場合は、AssmemblyResolve イベントが発生し、構成オプションに基づいてアクセス可能な場所から動的にロードされます。 .

アクセス可能な場所は、URL、まったく異なるパス、さらにはネットワーク パスの場合もあります。明らかにこの例ではありませんが、データベースからの BLOB である可能性さえあります。

于 2012-10-04T08:59:47.110 に答える
0

最初の解決策は、次を使用することです。

Assembly asm = Assembly.LoadFrom(path);

2 番目は: MEF

于 2012-10-04T08:34:56.357 に答える
0

あなたが探しているのは、おそらく実行時にアセンブリを動的にロードする方法です。

このビデオを見てください: http://www.youtube.com/watch?v=WBoA36pwxJE

于 2012-10-04T08:35:45.110 に答える