我有一个包含一个函数来汇总两个数字一个C#ClassLibrary:在外部程序中加载DLL?
namespace ClassLibrary1
{
public class Calculator
{
public int Calc(int i, int b) {
return i + b;
}
}
}
我想外部加载从其他C#应用这个DLL。我怎样才能做到这一点?
我有一个包含一个函数来汇总两个数字一个C#ClassLibrary:在外部程序中加载DLL?
namespace ClassLibrary1
{
public class Calculator
{
public int Calc(int i, int b) {
return i + b;
}
}
}
我想外部加载从其他C#应用这个DLL。我怎样才能做到这一点?
你的意思是要加载它动态地,通过文件名?然后是的,你可以使用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的例子,但我写的,所以不要担心!)
更多示例:http://www.csharp-examples.net/reflection-examples/ – Fabio
右键单击Visual Studio项目资源管理器中的引用,然后选择程序集。然后你可以使用它:
using ClassLibrary1;
class Program
{
static void Main()
{
Calculator calc = new Calculator();
int result = calc.Cal(1, 2);
}
}
如果傻冒使用Visual Studio中,你可以在你的项目中引用这个dll,比包括在新的源代码中的命名空间
的答案只是建立由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);
}
这里作为dynamic
类型instance
,你没有找到通过反射的方法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);
}
这会给你最好的表现。
如果你使用visual studio:添加引用,然后搜索你的dll – MCSI
你有没有读过关于.NET/C#基础的东西? –
这是为什么downvoted?它看起来可能并不明显(反正显而易见);请参阅@ minitech的答案。 –