从C#的Assembly.LoadFrom()方法中返回对象

3
我正在尝试为我正在开发的游戏制作一个扩展设置(不会详细说明),但是单个扩展所需要的只是将1个.dll文件添加到我添加的Expansions文件夹中。
我已经找出如何访问下面所示添加到此文件夹中的.dll:
Assembly ExpAssembly = Assembly.LoadFrom("Expansions/Intrique.dll");
Type myType = ExpAssembly.GetTypes()[0];

这是我正在尝试加载的类的示例:

public class Expansion: MyGame.Expansion {
    public Expansion() {
         //Stuff
    }
    public string SomeMethod()
    {
        return "Test";
    }
}

调用以下代码可以成功运行SomeMethod()。
MethodInfo Method = myType.GetMethod("SomeMethod");
object myInstance = Activator.CreateInstance(myType);
MessageBox.Show(Method.Invoke(myInstance, null).ToString());

但我想做的是能够通过写Expansion expObj;并调用new Expansion()来为其赋值,而这个调用不在库文件本身中。


像这样吗?Expansion expObj = (Expansion) myInstance; @DanielA.White - apotter96
你试过那个了吗? - Daniel A. White
你不能静态地使用一个动态加载的类型。如果你想这样做,正常引用dll即可。 - Blorgbeard
2
无法使用Intrique.Expansion,因为它会导致编译器错误。但是你可以使用MyGame.Expansion,因为Intrique.Expansion是从它派生出来的。 - John Wu
@Blorgbeard 我这么做是因为我想让用户能够自己制作扩展。 :/ - apotter96
无论如何,@DanielA.White 告诉我。我应该知道将对象转换为 Expansion 对象。哈哈,我真傻。 - apotter96
1个回答

3
(为了回答问题,我假设您的 Expansion 子类具有 Intrique.Expansion 的完全限定名称。即命名空间与 DLL 名称相同。)
由于您的主程序没有引用 Intrique.dll,在主程序的编写代码上下文中不能直接使用该 DLL 中的类型。也就是说,在您的主程序的编写代码上下文中,Intrique.Expansion 不是可用的类型,但在运行时可以使用。
按照您提供的代码示例,仅有可能使用 dynamic 才能实现所需功能。
dynamic myInstance = Activator.CreateInstance(myType);

myInstance.SomeMethod();

这是因为SomeMethod()仅在Intrique.Expansion中声明。在您的主程序中,没有其他类型可以静态使用该方法。
如果该方法是Intrique.Expansion实现的某个接口成员的实现,并且您的主程序引用了该接口,或者是MyGame.Expansion的某个virtual成员的override(如果不是实际声明),那么您可以将实例强制转换为接口类型或MyGame.Expansion,并以此方式调用该方法:
ISomeInterface myInstance = (ISomeInterface)Activator.CreateInstance(myType);

myInstance.SomeMethod();

或者:

MyGame.Expansion myInstance = (MyGame.Expansion)Activator.CreateInstance(myType);

myInstance.SomeMethod();

最后,考虑到您正在尝试实现某种可扩展性架构,您可以考虑使用托管可扩展框架,该框架专门设计用于处理此类问题中的许多混乱部分。

我最终做的是 MyGame.Expansion expObj = (MyGame.Expansion) myInstance;,它按照我的需求工作。 - apotter96

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接