示例控制台程序.
class Program
{
static void Main(string[] args)
{
// ... code to build dll ... not written yet ...
Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll");
// don't know what or how to cast here
// looking for a better way to do next 3 lines
IRunnable r = assembly.CreateInstance("TestRunner");
if (r == null) throw new Exception("broke");
r.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
我想动态构建一个程序集(.dll),然后加载程序集,实例化一个类,并调用该类的Run()方法.我应该尝试将TestRunner类转换为某些东西吗?不确定一个程序集中的类型(动态代码)如何知道我的(静态程序集/ shell应用程序)中的类型.使用几行反射代码只在一个对象上调用Run()会更好吗?该代码应该是什么样的?
更新:威廉埃德蒙森 - 见评论
我有一个集会.在这个程序集中,我有一个类和接口.我需要在运行时加载这个程序集,并希望创建该类的对象,并且还想使用该接口.
Assembly MyDALL = Assembly.Load("DALL"); // DALL is name of my dll
Type MyLoadClass = MyDALL.GetType("DALL.LoadClass"); // LoadClass is my class
object obj = Activator.CreateInstance(MyLoadClass);
Run Code Online (Sandbox Code Playgroud)
这是我的代码.怎么可以改进?
我们有一个供应商,提供访问其硬件的库.不幸的是,如果您有多个设备,则需要多次导入其库,并使用不同的dll名称.因此,我们有一吨重复的代码,我担心它很快就会成为维护的噩梦.
我们现在所拥有的是:
namespace MyNamespace {
public static class Device01 {
public const string DLL_NAME = @"Device01.dll";
[DllImport(DLL_NAME, EntryPoint = "_function1")]
public static extern int Function1(byte[] param);
Run Code Online (Sandbox Code Playgroud)
...
[DllImport(DLL_NAME, EntryPoint = "_function99")]
public static extern int Function99(int param);
}
Run Code Online (Sandbox Code Playgroud)
....
public static class Device16 {
public const string DLL_NAME = @"Device16.dll";
[DllImport(DLL_NAME, EntryPoint = "_function1")]
public static extern int Function1(byte[] param);
Run Code Online (Sandbox Code Playgroud)
...
[DllImport(DLL_NAME, EntryPoint = "_function99")]
public static extern int Function99(int param);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用的是C或C++,我只会在静态类中定义一个文件和#include它们多次,不是很好但是比替代方案好,但在C#中我没有那个选项.
如果有人对如何有效地定义工厂有任何聪明的想法,这将允许我们生成尽可能多的静态设备类,我会非常感兴趣.
谢谢,
编辑:函数原型是非常多变的,所以任何依赖它们的方法都是不合适的.感谢到目前为止的建议,我并没有如此迅速地阐述这么多想法.