我有一个ASP.NET MVC应用程序。
我有一个名为Example
的示例类public class Example
{
public int Id { get; set; }
public string Property1{ get; set; }
public string Property2{ get; set; }
}
我还有一个测试方法 - TestingCallFromSeparateConsoleApp,它可以执行某些功能并返回一个示例列表
public List<Example> TestingCallFromSeparateConsoleApp()
{
List<Example> exampleList = new List<Example>();
exampleList.Add(new Example
{
Id = 1,
Property1 = "First",
Property2 = "First",
});
exampleList.Add(new Example
{
Id = 2,
Property1 = "Second",
Property2 = "Second",
});
return exampleList;
}
我有一个单独的控制台应用程序,它手动加载MVC DLL。
我可以调用TestingCallFromSeparateConsoleApp方法,并将结果作为类型对象返回。
我正在尝试将结果转换为正确类型的List of Example。
asm = Assembly.LoadFrom(assemblyFile);
var smsAppInstance = asm.CreateInstance("EngineeringAssistantMVC.Controllers.TestController", false, BindingFlags.CreateInstance, null, null, null, null);
var ExampleClass = asm.GetType("EngineeringAssistant.Controllers.Example", true);
var ec = ExampleClass.GetType();
这会得到Example类的详细信息,但我仍然无法弄清楚如何实际实例化并使用类型为“Example”的类
在我的控制台中我如何基本上说:
ExampleClass newExampleClass = new ExampleClass();
所以我可以说:
var result = smsAppInstance.GetType().GetMethod("TestingCallFromSeparateConsoleApp").Invoke(smsAppInstance, argumentsTopass);
可以将结果转换为List<ExampleClass>
编辑1
我手动加载dll文件,我不想通过引用添加它。
答案 0 :(得分:1)
实例化对象是一个运行时概念。变量声明是编译时的概念。您可以实例化在运行时加载的对象,但不能在代码中声明一个对象,因为在编译时编译器不知道它。
话虽如此,您仍然可以声明一些可以保存对手动加载的对象实例的引用的变量。显而易见的是object
。在您的情况下,您还可以声明一个IEnumerable<object>
,它应该由于协方差而起作用。除此之外,编译器不知道您可以在代码中编写类型。
如果你有一个IEnumerable<object>
,那么你做的不仅仅是迭代它。您无法访问任何ExampleClass&#39;属性或方法是正常的方式。你必须使用反射。
处理这种情况的常用方法是
创建第三个程序集,仅包含一个接口,例如IExampleClass
。
实现ExampleClass
的程序集引用了第三个程序集。
ExampleClass声明为class ExampleClass : IExampleClass
控制台应用程序还引用了第三个程序集。
在控制台应用程序的代码中,您现在可以声明对类型说明符为IExampleClass
的对象的引用,并以这种方式访问所有属性和方法。
所以...你的选择是反思或界面。
答案 1 :(得分:0)
Right click project -> Add -> Reference
如果您的解决方案中有项目,请选择项目,或按浏览并选择您的DLL。
您会发现名称空间和类在intellisense中出现,您可以使用正确的类型正常引用它们
或者,如果你真的想要,请使用动态。或者你不得不一直反映一路。如果您选择接受它,这是您的使命
问题是,您是否无法在运行时转换为Type
,并在编译时使用它。
<强>更新强>
我想这样做的原因是因为我引用了dll和 然后通过Visual Studio运行控制台应用程序它工作正常,但如果我 运行控制台应用程序的exe,它会抛出一个未处理的异常: 无法加载文件或程序集'EngineeringAssistantMVC',所以我 想手动加载DLL会起作用。
确保你的位数是正确的,同时确保你引用了EngineeringAssistantMVC.dll
以及它所依赖的任何其他dll ..