接下来的情况我正在尝试创建一个程序,它将读取一个字符串并使用该字符串来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文件。
答案 0 :(得分:0)
以下是一对q / a,可以帮助您入门:
答案 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
更容易使用,但它会为每个函数调用生成一个新的内存中程序集。由于除非卸载应用程序域,否则无法卸载程序集,您必须每次都在新的应用程序域中创建程序集,或者让程序慢慢吞噬内存。我想这取决于您希望用户在会话中生成多少次调用。如果它只是少数,那么没问题。但是如果你的程序预计会运行很长时间并且会产生很多(数百到数千?)这些调用(即为很多函数生成代码),那么你需要确保每个程序都是自己的。应用程序域,以便您可以卸载应用程序域以回收内存。