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,我不能将参数推到堆栈上并调用它。。。。