我有一个C#ClassLibrary,它包含一个对两个数字相加的函数:
namespace ClassLibrary1
{
public class Calculator
{
public int Calc(int i, int b) {
return i + b;
}
}
}
我想从外部的其他C#应用程序加载这个dll。我怎么能这样做?
答案 0 :(得分:12)
你的意思是你想通过文件名动态加载吗?然后是的,您可以使用Assembly.LoadFile
方法,如下所示:
// Load the assembly
Assembly a = Assembly.LoadFile(@"C:\Path\To\Your\DLL.dll");
// Load the type and create an instance
Type t = a.GetType("ClassLibrary1.Calculator");
object instance = a.CreateInstance("ClassLibrary1.Calculator");
// Call the method
MethodInfo m = t.GetMethod("Calc");
m.Invoke(instance, new object[] {}); // Get the result here
(来自here的翻译示例,但我写了所以不要担心!)
答案 1 :(得分:2)
建立在minitech的答案之上..如果你可以使用C#4.0,你可以省略一些反射调用。
public static void Main()
{
Assembly ass = Assembly.LoadFile(@"PathToLibrar\ClassLibraryTest.dll");
var type = ass.GetType("ClassLibrary1.Calculator");
dynamic instance = Activator.CreateInstance(type);
int add = instance.Calc(1, 3);
}
此处为instance
类型的dynamic
,您无需通过反射找到方法Calc
。
但最好的方法是定义上游接口
public interface ICalculator
{
int Calc(int i, int b);
}
并在您的下游课程中实施
public class Calculator : ICalculator
{
public int Calc(int i, int b)
{
return i + b;
}
}
然后你可以做最小的反射来构造对象。
public static void Main()
{
Assembly ass = Assembly.LoadFile(@"PathToLibrar\ClassLibraryTest.dll");
var type = ass.GetType("ClassLibrary1.Calculator");
ICalculator instance = Activator.CreateInstance(type) as ICalculator;
int add = instance.Calc(1, 3);
}
这将为您提供最佳表现。
答案 2 :(得分:-1)
右键单击Visual Studio中项目资源管理器中的引用,然后只需选择程序集。然后你可以使用它:
using ClassLibrary1;
class Program
{
static void Main()
{
Calculator calc = new Calculator();
int result = calc.Cal(1, 2);
}
}
答案 3 :(得分:-1)
如果您使用visual studio,您可以在项目中引用此dll,而不是在新源代码中包含命名空间