问题描述
我正在编写一个数据采集应用程序,它使用硬件驱动程序的包装类。我的目标是让外部用户能够为他们的硬件编写自己的包装器。似乎程序集是存储这些驱动程序包装器的方式,由应用程序加载。所以我从一个基于 Microsoft 示例的非常简单的测试代码开始: Loading DLLs at runtime in C# 它在写入程序集方法时起作用。我添加了一个 read 方法,但它不起作用。见代码:
namespace DLL
{
using System;
public class Class1
{
public void Output(string s)
{
Console.WriteLine(s);
}
public string DriverName() // My added method
{
return "Test";
}
}
}
这里是主要的:
namespace ConsoleApplication1
{
using System;
using System.Reflection;
// See: https://stackoverflow.com/questions/18362368/loading-dlls-at-runtime-in-c-sharp
public class Program
{
public static void Main(string[] args)
{
var DLL = Assembly.LoadFile(@"...\Documents\VS\Tests\DLL Test\DLL\bin\Debug\netstandard2.0\DLL.dll");
foreach (Type type in DLL.GetExportedTypes())
dynamic c = Activator.CreateInstance(type);
c.Output("Hello"); // Works
Console.WriteLine(c.DriverName()); // Doesn't work
}
Console.ReadLine();
}
}
}
它给出了一个编译时错误:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''DLL.Class1' does not contain a definition for 'DriverName''
为什么这只能以一种方式起作用而另一种不起作用?有没有简单的解决办法?
解决方法
试着加括号
namespace ConsoleApplication1
{
using System;
using System.Reflection;
// See: https://stackoverflow.com/questions/18362368/loading-dlls-at-runtime-in-c-sharp
public class Program
{
public static void Main(string[] args)
{
var DLL = Assembly.LoadFile(@"...\Documents\VS\Tests\DLL Test\DLL\bin\Debug\netstandard2.0\DLL.dll");
foreach (Type type in DLL.GetExportedTypes())
{
dynamic c = Activator.CreateInstance(type);
c.Output("Hello"); // Works
Console.WriteLine(c.DriverName()); // Doesn't work
}
Console.ReadLine();
}
}
}