C# C委托、DLL、动态内容
在这种情况下,我试图创建一个程序,该程序将读取一个字符串,并使用该字符串来动态链接库中的函数 看到这个了吗C# C委托、DLL、动态内容,c#,reflection,delegates,C#,Reflection,Delegates,在这种情况下,我试图创建一个程序,该程序将读取一个字符串,并使用该字符串来动态链接库中的函数 看到这个了吗 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void MessageBoXy(string a, string b); UnmanagedLibrary test = new UnmanagedLibrary("Test.dll"); MessageBoXy testX = test.GetUn
[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
这一切都很好,但这就是我需要帮助的地方
您可以看到这个私有委托void MessageBoXystring a,string b;它是静态的,无法更改。。。。。现在我需要程序读取字符串并更改委托的返回值和参数。。。。比如说
我想读取一个字符串,比如Call Test.dll返回字符串PARAMS int,int,char,string
现在应该可以无限扩展参数并为其创建委托,然后调用DLL中的函数
我正在制作一种宏程序,我希望用户能够输入一个DLL返回值和参数,然后调用DLL,所以我不知道用户需要什么参数或返回值,所以c代码必须能够创建我需要的任何委托
我需要什么?
我需要一个类或示例来演示如何生成对象,设置一个返回值,设置参数,然后使用对象[]数组调用对象,该数组将成为参数,例如myFuncstring a,将创建字符串b,对象[0]将是参数1等等
归根结底,我需要能够从用户制作的脚本中动态调用dll文件。这里有几个问题可以帮助您开始:
以下是一些应该让你开始的问答:
所以用户会给你一个字符串,比如Call Test.dll返回字符串PARAMS int,int,char,string,你想生成调用它的代码吗?我想,叫它什么名字 首先,Call Test.dll没有说明在Test.dll中调用哪个函数。我想你的意思是用户会说在DLL中调用哪个函数?或者您的程序应该枚举函数并确定调用哪个函数 我假设用户指定了函数和DLL名称。如果不是这样,请参阅其中一条注释,以获取有关如何枚举DLL中函数的信息 无论您如何获得要调用的函数的名称,您仍然需要编写调用该函数的代码 至少有两种方法可以做到这一点。您可以创建并调用。也可以使用创建动态部件 使用DynamicMethod更节省内存,但要做到这一点,您必须发出IL。这将需要一点学习曲线来准确地找出您需要生成的内容,但这可能是最好的解决方案
CodeDOM比DynamicMethod更易于使用,但它会为每个函数调用生成一个新的内存中程序集。由于除非卸载应用程序域,否则无法卸载程序集,因此每次都必须在新的应用程序域中创建程序集,或者让程序慢慢消耗内存。我想这取决于您希望用户在一个会话中生成多少调用。如果只是少数,那没问题。但是如果你的程序预计运行很长一段时间,并产生数百个?几千?在这些调用中,即为许多函数生成代码,然后您需要确保每个调用都在其自己的应用程序域中,以便您可以卸载应用程序域以回收内存。因此用户将给您一个类似Call Test.dll的字符串返回字符串PARAMS int,int,char,string,你想生成调用它的代码吗?我想,叫它什么名字 首先,Call Test.dll没有说明在Test.dll中调用哪个函数。我想你的意思是用户会说在DLL中调用哪个函数?或者您的程序应该枚举函数并确定调用哪个函数 我假设用户指定了函数和DLL名称。如果不是这样,请参阅其中一条注释,以获取有关如何枚举DLL中函数的信息 无论您如何获得要调用的函数的名称,您仍然需要编写调用该函数的代码 至少有两种方法可以做到这一点。您可以创建并调用。也可以使用创建动态部件 使用DynamicMethod更节省内存,但要做到这一点,您必须发出IL。这将需要一点学习曲线来准确地找出您需要生成的内容,但这可能是最好的解决方案 CodeDOM比DynamicMethod更易于使用,但它会为每个函数调用生成一个新的内存中程序集。由于除非卸载应用程序域,否则无法卸载程序集,因此每次都必须在新的应用程序域中创建程序集,或者让程序慢慢消耗内存。我想这取决于您希望用户在一个会话中生成多少调用。如果是
只有一把,那就没问题了。但是如果你的程序预计运行很长一段时间,并产生数百个?几千?在这些调用中,即为许多函数生成代码,然后,您需要确保每个应用程序域都位于自己的应用程序域中,以便您可以卸载应用程序域以回收内存。可能重复您发布的“答案”或根据您发布的“答案”关闭。可能重复或根据您发布的“答案”关闭。例如,用户可以输入以下行:CallDLLUser32.dll、int32、MessageBoxA、str、,你好,世界,str,你好,耶;当然,这是针对宏/脚本编写的,因此用户可以将其中一个或10个或1000个用于任意数量的PARM和返回规范。。。。我可以在C/C++和汇编中这样做,没有任何问题,但使用C,我不能将参数推到堆栈上并调用它……例如,用户可以输入以下行:CallDLLUser32.dll、int32、MessageBoxA、str、Hello world、str、Hello yea;当然,这是针对宏/脚本编写的,因此用户可以将其中一个或10个或1000个用于任意数量的PARM和返回规范。。。。我可以在C/C++和汇编中完成这项工作,而没有任何问题,但使用C,我不能将参数推到堆栈上并调用它。。。。