【发布时间】:2022-01-02 18:11:42
【问题描述】:
我有一个包含一些业务逻辑的外部 DLL。 我想做这样的事情:
- 在运行时加载 DLL
- 按某些标准过滤可用类型。
- 创建目标类型实例 即动态 c = Activator.CreateInstance(type);
- 将先前创建的实例转换为某个接口以将其传递给处理程序方法
所以外部 dll 将包含类似的内容:
namespace External.Handler.Namespace
{
using System;
public interface IHandler {
int Process(string arg);
int ProcessV2(string arg);
}
public class HandlerImpl : IHandler
{
public int Process(string arg)
{
// ... implementation
return 0;
}
public int ProcessV2(string arg)
{
// ... implementation
return 0;
}
}
}
在目标服务我想加载它并尝试转换到内部接口
namespace My.Target.Namespace
{
using System;
using System.Reflection;
public interface IInternalHandler {
int Process(string arg)
}
class Program
{
static void Main(string[] args)
{
var DLL = Assembly.LoadFile(@"path\to\dll");
foreach(Type type in DLL.GetExportedTypes())
{
dynamic c = Activator.CreateInstance(type);
try
{
// I would like to know: how perform it?
var typedInstance = (IInternalInterface) c;
Handle(typedInstance);
}
catch {}
}
Console.ReadLine();
}
public static void Handle(IInternalHandler handler, string arg) {
int result = handler.Process(arg);
Console.log(result);
}
}
}
总结:是否可以将dynamic 转换为部分匹配的接口?
【问题讨论】:
-
你试过了吗:
IInternalInterface c = Activator.CreateInstance(type); -
@PoulBak 是的,我得到了例外
Unable to cast object of type 'ExternalHandlerNamespace.HandlerImpl' to type 'MyTargetNamespace.IInternalHandler'.
标签: c# .net dynamic dllimport system.reflection