从C#

时间:2015-06-09 23:43:34

标签: c# dll

我正在尝试为我正在开发的这个游戏进行扩展设置(不打算详细介绍),但是所有单个扩展都需要将{。}文件添加到{{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;来分配它,但不能在库本身中调用它。

1 个答案:

答案 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,它专门用于处理这类事情的许多混乱部分。