我有以下情况…
我的托管库需要使用一个不能100%保证在生产平台上存在的外部(托管)库。因此,我需要使用延迟绑定(手动检查目标dll是否存在,如果是加载到内存)。当然,如果它不存在,则优雅地失败…
一旦目标dll在内存中,我需要调用一个返回自定义类的方法(其类型在目标dll中定义)。
的例子:
外部dll: Name = '; extfactorycreator .dll ';
namespace Ext.Factory.Creator
{
public static class ExtFactoryCreator
{
public static Factory FactoryCreator()
{
return new Factory();
}
}
public class Factory
{
public Factory(){}
}
}
我的图书馆
public class ExtFactoryCreator.Mine
{
private Ext.Factory.Creator.Factory localFactory;
public void Init()
{
localFactory = AppDomain.CurrentDomain.Load("ExtFactoryCreator.dll").CreateInstance("ExtFactoryCreator").FactorCreator();
}
}
(让我知道如果我得到当前的语法)。
但我的问题,是如何从外部dll定义返回类型?我没有一个静态引用它在我的项目,因此我不能定义private Ext.Factory.Creator.Factory
类型?
如果你对目标库有控制权-只要让它使用一些你可以在这个库和你的主应用程序之间共享的接口。
如果您没有控制库(第三方),那么它实际上可能是dynamic
的好情况。例如,我们在库中有这样的代码:
public static class ExtFactoryCreator
{
public static Factory FactoryCreator()
{
return new Factory();
}
}
public class Factory
{
public Factory(){}
public string Value => "test";
public void Hello() {
Console.WriteLine("Hello from library");
}
}
则dynamic
可用于主要应用:
public class LibraryWrapper {
private dynamic _localFactory;
public void Init() {
// load assembly from somewhere if present
var asm = Assembly.LoadFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FullNetLib.dll"));
// create that factory
_localFactory = asm.GetType("FullNetLib.ExtFactoryCreator").GetMethod("FactoryCreator").Invoke(null, new object[0]);
}
public string GetValue() {
// do not expose dynamic to the public if possible
return _localFactory.Value;
}
public void Hello() {
_localFactory.Hello();
}
}