WPF 主应用程序动态调用 DLL...需要在 return 之前从 DLL 向主应用程序发送消息
WPF main app dynamically invoking a DLL...need messaging from the DLL prior to the return to the main app
我在 Whosebug 上进行了大量谷歌搜索和搜索,但无法弄清楚如何在从 DLL returning 之前从动态调用的 DLL 中获取进度消息。假设 DLL 已完成 10%...我想显示该进度。我习惯于只显示通话中的 returns,但在这种情况下我需要进度。这是我调用 DLL 的代码(C#、WPF 项目)。只是好奇如何在 return...
之前取回消息
string pathAndDLLFile = Path.GetFullPath(DLLName + ".DLL");
Assembly a = Assembly.LoadFile(pathAndDLLFile);
string typeField = DLLNamespace + "." + DLLClass;
Type myType = a.GetType(typeField);
MethodInfo testMethod = myType.GetMethod(DLLMethod);
object obj = Activator.CreateInstance(myType);
object c = testMethod.Invoke(obj, new Object[] { nodeChild });
这是我的 DLL...
using System.Xml;
namespace InitialTest2
{
public class Class1
{
public int test(XmlNode xmlTest)
{
int testCount = 0;
int progress = 0;
foreach (XmlAttribute attributeChild in xmlTest.Attributes)
{
if (attributeChild.Name != "name" && attributeChild.Name != "testNumber" && attributeChild.Name != "Estimate" && !attributeChild.Name.Contains("DLL"))
{
if ((attributeChild.Name.Contains("MinLimit")) || (attributeChild.Name.Contains("MaxLimit")) || (attributeChild.Name.Contains("Unit")))
{
// not the attribute value
}
else
{
testCount ++;
}
}
progress = progress + 1;
// ToDo: report progress back to the main ap
}
return testCount;
}
public int test3(XmlNode xmlTest)
{
return 3;
}
}
public class Class2
{
public int test2(XmlNode xmlTest)
{
return 2;
}
}
}
这与动态调用无关,但事实是游览 test
方法 return 是一个单一的 int
值,没有别的。
这样的方法不能向调用者报告或 return 除了 int
值以外的任何东西。您希望如何以及在何处获取局部变量 progress
的当前值?在 foreach
循环完成之前,您不会 return 方法中的任何内容。
如果你想 return 从同步方法取得某种进展,或至少几个值,你可以将其 return 类型更改为 IEnumerable<int>
并迭代return 值,例如:
public IEnumerable<int> test(XmlNode xmlTest)
{
int testCount = 0;
int progress = 0;
foreach (XmlAttribute attributeChild in xmlTest.Attributes)
{
if (attributeChild.Name != "name" && attributeChild.Name != "testNumber" && attributeChild.Name != "Estimate" && !attributeChild.Name.Contains("DLL"))
{
if ((attributeChild.Name.Contains("MinLimit")) || (attributeChild.Name.Contains("MaxLimit")) || (attributeChild.Name.Contains("Unit")))
{
// not the attribute value
}
else
{
testCount++;
}
}
yield return progress + 1;
// ToDo: report progress back to the main ap
}
yield return testCount;
}
用法:
IEnumerable<int> c = testMethod.Invoke(obj, new Object[] { nodeChild }) as IEnumerable<int>;
if (c != null)
{
int count;
foreach (var progress in c)
{
Console.WriteLine(progress);
count = progress;
}
Console.WriteLine(count);
}
我在 Whosebug 上进行了大量谷歌搜索和搜索,但无法弄清楚如何在从 DLL returning 之前从动态调用的 DLL 中获取进度消息。假设 DLL 已完成 10%...我想显示该进度。我习惯于只显示通话中的 returns,但在这种情况下我需要进度。这是我调用 DLL 的代码(C#、WPF 项目)。只是好奇如何在 return...
之前取回消息string pathAndDLLFile = Path.GetFullPath(DLLName + ".DLL");
Assembly a = Assembly.LoadFile(pathAndDLLFile);
string typeField = DLLNamespace + "." + DLLClass;
Type myType = a.GetType(typeField);
MethodInfo testMethod = myType.GetMethod(DLLMethod);
object obj = Activator.CreateInstance(myType);
object c = testMethod.Invoke(obj, new Object[] { nodeChild });
这是我的 DLL...
using System.Xml;
namespace InitialTest2
{
public class Class1
{
public int test(XmlNode xmlTest)
{
int testCount = 0;
int progress = 0;
foreach (XmlAttribute attributeChild in xmlTest.Attributes)
{
if (attributeChild.Name != "name" && attributeChild.Name != "testNumber" && attributeChild.Name != "Estimate" && !attributeChild.Name.Contains("DLL"))
{
if ((attributeChild.Name.Contains("MinLimit")) || (attributeChild.Name.Contains("MaxLimit")) || (attributeChild.Name.Contains("Unit")))
{
// not the attribute value
}
else
{
testCount ++;
}
}
progress = progress + 1;
// ToDo: report progress back to the main ap
}
return testCount;
}
public int test3(XmlNode xmlTest)
{
return 3;
}
}
public class Class2
{
public int test2(XmlNode xmlTest)
{
return 2;
}
}
}
这与动态调用无关,但事实是游览 test
方法 return 是一个单一的 int
值,没有别的。
这样的方法不能向调用者报告或 return 除了 int
值以外的任何东西。您希望如何以及在何处获取局部变量 progress
的当前值?在 foreach
循环完成之前,您不会 return 方法中的任何内容。
如果你想 return 从同步方法取得某种进展,或至少几个值,你可以将其 return 类型更改为 IEnumerable<int>
并迭代return 值,例如:
public IEnumerable<int> test(XmlNode xmlTest)
{
int testCount = 0;
int progress = 0;
foreach (XmlAttribute attributeChild in xmlTest.Attributes)
{
if (attributeChild.Name != "name" && attributeChild.Name != "testNumber" && attributeChild.Name != "Estimate" && !attributeChild.Name.Contains("DLL"))
{
if ((attributeChild.Name.Contains("MinLimit")) || (attributeChild.Name.Contains("MaxLimit")) || (attributeChild.Name.Contains("Unit")))
{
// not the attribute value
}
else
{
testCount++;
}
}
yield return progress + 1;
// ToDo: report progress back to the main ap
}
yield return testCount;
}
用法:
IEnumerable<int> c = testMethod.Invoke(obj, new Object[] { nodeChild }) as IEnumerable<int>;
if (c != null)
{
int count;
foreach (var progress in c)
{
Console.WriteLine(progress);
count = progress;
}
Console.WriteLine(count);
}