C# 从C中的dll调用程序中的方法#

C# 从C中的dll调用程序中的方法#,c#,dll,C#,Dll,我想从dll调用程序中的方法。 现在我可以添加一个参数公共空白栏(动作打印,字符串a)。但是还有其他的称呼吗? dll中的代码: class Foo { public void Bar(string a) { //now I want to call method from program Program.Print(a); // doesn't work } } class Foo { public void Bar(string a)

我想从dll调用程序中的方法。
现在我可以添加一个参数
公共空白栏(动作打印,字符串a)
。但是还有其他的称呼吗?
dll中的代码:

class Foo {
    public void Bar(string a) {
        //now I want to call method from program
        Program.Print(a); // doesn't work
    }
}
class Foo {
    public void Bar(string a) {
        Program.Print(a);
    }
}
节目:

class Program {
    public static void Main(string[] args) {
        var dll = Assembly.LoadFile(@"my dll");
        foreach(Type type in dll.GetExportedTypes())
        {
            dynamic c = Activator.CreateInstance(type);
            c.Bar(@"Hello");
        }
        Console.ReadLine();
    }
    public static void Print(string s) {
        Console.WriteLine(s);
    }
}
class Program {
    public static void Main(string[] args) {
        var dll = Assembly.LoadFile(@"my dll");
        foreach(Type type in dll.GetExportedTypes())
        {
            dynamic c = Activator.CreateInstance(type);
            c.Bar(@"Hello");
        }
        Console.ReadLine();
    }
    public static void Print(string s) {
        Console.WriteLine(s);
    }
}
from()

可能吗?

您可以使用回调

您可以在dll中添加一个事件

从程序中指定事件

因此,您可以从dll调用事件

在dll中放入公共类:

public event EventHandler MyCallback;
从程序将其设置为所需的方法:

MyDllClassInstance.MyCallback = TheMethod;
现在,您可以从dll类编写:

if (MyCallback != null) MyCallback(sender, e);
您可以使用任何预定义的事件处理程序或创建自己的事件处理程序

例如,对于dll代码:

public delegate PrintHandler(string s);

public event PrintHandler MyCallback;

public void Bar(string s)
{
  if (MyCallback != null) MyCallback(s);
}
因此,在程序中,您可以:

class Program {
  public static void Main(string[] args) {
      var dll = Assembly.LoadFile(@"my dll");
      foreach(Type type in dll.GetExportedTypes())
      {
          dynamic c = Activator.CreateInstance(type);
          c.MyCallback = Print;
          c.Bar(@"Hello");
      }
      Console.ReadLine();
  }
  public static void Print(string s) {
      Console.WriteLine(s);
  }
}

您可以使用
操作
而不是定义
打印处理程序
委托。

您可以对其使用反射

  • 查找您需要使用的类型
  • 找到要调用的静态方法
  • 使用参数调用该方法

  • 请参见DLL中的,我添加了对程序的引用,该代码现在可以运行了。
    dll中的代码:

    class Foo {
        public void Bar(string a) {
            //now I want to call method from program
            Program.Print(a); // doesn't work
        }
    }
    
    class Foo {
        public void Bar(string a) {
            Program.Print(a);
        }
    }
    
    节目:

    class Program {
        public static void Main(string[] args) {
            var dll = Assembly.LoadFile(@"my dll");
            foreach(Type type in dll.GetExportedTypes())
            {
                dynamic c = Activator.CreateInstance(type);
                c.Bar(@"Hello");
            }
            Console.ReadLine();
        }
        public static void Print(string s) {
            Console.WriteLine(s);
        }
    }
    
    class Program {
        public static void Main(string[] args) {
            var dll = Assembly.LoadFile(@"my dll");
            foreach(Type type in dll.GetExportedTypes())
            {
                dynamic c = Activator.CreateInstance(type);
                c.Bar(@"Hello");
            }
            Console.ReadLine();
        }
        public static void Print(string s) {
            Console.WriteLine(s);
        }
    }
    

    你是说
    MyProgram
    还是
    Program
    ?“不行”是什么意思?@JohnWu我的意思是
    Program
    。我的意思是它显示错误名称程序在curcurcurent内容中不存在。使用“不工作”。只有在构建主项目后才能构建DLL。虽然这在技术上是可能的,但这是您强烈希望避免的。使用接口向插件公开主机服务。我同意@HansPassant。如果您正在构建一个可插拔的体系结构,那么您将需要一种有序的方式来向插件公开服务。一个
    IPluginContext
    或什么的,并给它一个
    Print
    方法。