C#代表,dll,动态的东西

时间:2011-11-21 02:57:06

标签: c# reflection delegates

接下来的情况我正在尝试创建一个程序,它将读取一个字符串并使用该字符串来dll中的函数。

见这个

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void MessageBoXy(string a, string b);

UnmanagedLibrary test = new UnmanagedLibrary("Test.dll");
MessageBoXy testX = test.GetUnmanagedFunction<MessageBoXy>("Testy");
testX.DynamicInvoke("Hello there", "lol");

当我使用DynamicInvoke时,我的“Test.dll”被调用,并且使用通过c#传递的字符串从dll执行MessageBoxA

这一切都很好而且很好但是我需要帮助的地方进来....

你看到这个private delegate void MessageBoXy(string a, string b);是静态的,无法改变.....现在我需要程序读取字符串并更改代表的返回值和参数....例如

我想读取一个字符串,如“Call Test.dll RETURN string PARAMS int,int,char,string”

现在应该可以无限扩展params并为它创建委托然后调用DLL中的函数。

我正在制作一种宏程序,我希望用户能够输入DLL返回值和参数然后调用dll,所以我不知道用户需要什么参数或返回值所以c#代码必须能够创建我需要的任何委托。

我需要什么?

我需要一个类或一个示例,向我展示如何生成对象设置返回值,设置params然后使用object []数组调用该对象,这将成为诸如将创建myFunc(string a, string b),对象[0]将为param 1,依此类推....

底线是我需要能够从用户制作的脚本中动态调用dll文件。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

所以用户会给你一个类似“Call Test.dll RETURN string PARAMS int,int,char,string”的字符串,你想生成调用它的代码吗?而且,我想,称之为?

首先,“Call Test.dll”没有说明在Test.dll中调用哪个函数。我假设你的意思是用户会说在DLL中调用哪个函数?或者你的程序是否应该枚举函数并确定要调用哪个函数?

我假设用户指定了函数以及DLL名称。如果不是这种情况,请参阅其中一条注释,了解如何枚举DLL中的函数。

但是,您获取要调用的函数的名称,您仍然需要编写将调用该函数的代码。

至少有两种方法可以解决这个问题。您可以创建并调用DynamicMethod。或者您可以使用CodeDOM创建动态程序集。

使用DynamicMethod可以提高内存效率,但是必须发出IL才能执行此操作。这将涉及一些学习曲线,以确切地确定您需要生成什么,但它可能是最好的解决方案。

CodeDOM比DynamicMethod更容易使用,但它会为每个函数调用生成一个新的内存中程序集。由于除非卸载应用程序域,否则无法卸载程序集,您必须每次都在新的应用程序域中创建程序集,或者让程序慢慢吞噬内存。我想这取决于您希望用户在会话中生成多少次调用。如果它只是少数,那么没问题。但是如果你的程序预计会运行很长时间并且会产生很多(数百到数千?)这些调用(即为很多函数生成代码),那么你需要确保每个程序都是自己的。应用程序域,以便您可以卸载应用程序域以回收内存。