我正在尝试为我正在开发的这个游戏进行扩展设置(不打算详细介绍),但是所有单个扩展都需要将{。}文件添加到{{1}中我添加的文件夹。
我已经想出如何访问这些.dll添加到此文件夹中,如下所示:
Expansions
以下是我正在尝试加载的类的示例:
Assembly ExpAssembly = Assembly.LoadFrom("Expansions/Intrique.dll");
Type myType = ExpAssembly.GetTypes()[0];
调用以下代码运行SomeMethod()就好了
public class Expansion: MyGame.Expansion {
public Expansion() {
//Stuff
}
public string SomeMethod()
{
return "Test";
}
}
但我想要做的是能够编写MethodInfo Method = myType.GetMethod("SomeMethod");
object myInstance = Activator.CreateInstance(myType);
MessageBox.Show(Method.Invoke(myInstance, null).ToString());
并通过从这个未引用的.dll调用Expansion expObj;
来分配它,但不能在库本身中调用它。
答案 0 :(得分:3)
(出于本答案的目的,我将假设您的Expansion
子类具有完全限定的Intrique.Expansion
名称。即名称空间与名称相同DLL)。
因为您的主程序不引用Intrique.dll,主程序中的代码不能直接使用该DLL中的类型。也就是说,Intrique.Expansion
在主程序的编写代码的上下文中不是可用的类型,尽管它可以在运行时使用。
从字面上理解您的代码示例,鉴于您现在拥有的代码,唯一可行的方法是使用dynamic
:
dynamic myInstance = Activator.CreateInstance(myType);
myInstance.SomeMethod();
这是因为SomeMethod()
在Intrique.Expansion
中仅声明 。没有任何其他类型可以在主程序中静态使用该方法。
如果该方法是Intrique.Expansion
实现的某个接口的成员的实现,以及您的主程序引用的接口,或者是override
virtual
MyGame.Expansion
成员的MyGame.Expansion
(这可能是你的主程序引用的,如果没有实际声明的话),那么你可以将实例分别转换为接口类型或ISomeInterface myInstance = (ISomeInterface)Activator.CreateInstance(myType);
myInstance.SomeMethod();
并以这种方式调用方法:
MyGame.Expansion myInstance = (MyGame.Expansion)Activator.CreateInstance(myType);
myInstance.SomeMethod();
或:
for($i=0;$i<$n;$i++)
{
echo "<form method='post'>
<input type='text' name='fname'>
<input type='text' name='lname'>
<input type='submit' name='submit".$i."' value='save'></form>";
}
最后,鉴于您正在尝试实现某种可扩展性体系结构,您可以考虑使用Managed Extensibility Framework,它专门用于处理这类事情的许多混乱部分。