如何将参数作为参考传递MethodInfo.Invoke?
这是我想要调用的方法:
private static bool test(string str, out byte[] byt)
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,但我失败了:
byte[] rawAsm = new byte[]{};
MethodInfo _lf = asm.GetTypes()[0].GetMethod("test", BindingFlags.Static | BindingFlags.NonPublic);
bool b = (bool)_lf.Invoke(null, new object[]
{
"test",
rawAsm
});
Run Code Online (Sandbox Code Playgroud)
返回的字节为空.
我无法想象如何使用Mono.Cecil向方法添加自定义属性我想要添加的属性是这样的:
.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 )
Run Code Online (Sandbox Code Playgroud)
有谁知道如何添加自定义属性
首先我认为dll DLLMain中的入口点,但是当我尝试在C#中导入它时,我得到一个错误,找不到入口点这是我的代码:
#include <Windows.h>
int Test(int x,int y)
{
return x+y;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0,L"Test",L"From unmanaged dll",0);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
如何为我的dll设置入口点?如果你不介意,你可以给我一些关于切入点的解释吗?
像我必须再次设置导入相同的DLL并更改入口点,以便我可以在同一个DLL中使用其他功能?提前致谢.
我用C#编写了一个控制台应用程序,我的代码是这样的:
while(true)
{
//do some stuff
System.Threading.Thread.Sleep(60000)
}
Run Code Online (Sandbox Code Playgroud)
我注意到我的应用程序的内存使用量大约是14k而"休眠".但后来我引用了System.Windows.Forms并使用了计时器,我发现内存使用率大幅下降.
我的问题是,在没有使用那么多内存的情况下,每隔几秒钟执行某项操作的正确方法是什么?
我从一个返回char*指针的本机DLL调用一个函数 ,如何将返回的指针转换为字符串?我试过了 :
char* c = function();
string s = new string(c);
Run Code Online (Sandbox Code Playgroud)
但它只是返回了一个奇怪的汉字,这不是正确的价值c.
这个让我发疯.
AssemblyDefinition asm1 = AssemblyDefinition.ReadAssembly(example);
AssemblyDefinition asm2 = AssemblyDefinition.ReadAssembly(example2);
asm2.MainModule.Types.Add(asm1.MainModule.Types[0]);
Run Code Online (Sandbox Code Playgroud)
每当我尝试执行上面的代码时,我得到这个错误'Type already attach'我决定在MonoCecil源代码中看到这个错误,我发现它抛出了这个错误,因为Type的MainMoudle不是asm2 MainModules.所以我决定将该类型复制到一个新类型.
TypeDefinition type2 = new TypeDefinition("", "type2", Mono.Cecil.TypeAttributes.Class);
foreach (MethodDefinition md in asm2.Methods )
{
type2.Methods.Add(md);
}
Run Code Online (Sandbox Code Playgroud)
然后将此类型正常添加到我的程序集中,但这会引发另一个错误,"不支持指定的方法.".有什么想法,我收到这个错误?
编辑:只是添加,我试图添加的类型包含一些使用指针的方法.这可能是问题吗?据我所知,mono支持但不支持混合模式.
反正有没有检查方法是否使用PInvoke?我正在使用MethodBase循环遍历程序集中的所有方法,但我想检查该方法是否使用PInvoke.这是我正在使用的代码:
foreach (MethodBase bases in mtd.GetType().GetMethods())
{
//check if the method is using pinvoke
}
Run Code Online (Sandbox Code Playgroud)
另外,如果有可能,我怎么能检查正在使用的DLL和被调用的函数/入口点?
我已经尝试过 strcmp 和 lstrcmp 。我什至尝试用 strlen 来完成它,但也没有成功,这就是我所拥有的
void check(LPCSTR lpText)
{
if( strmp(lpText, "test") == 0)
{
MessageBoxW(0, L"equal", 0, 0);
}
else
{
MessageBoxW(0, L"not equal", 0, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何它总是返回 1,如果重要的话,设置中的字符集也设置为“使用多字节字符集”。
我有一个巨大的检查列表,检查例如,如果整数是4或10,如果它是4,它将此int更改为10,反之亦然,所以我的检查将是这样的:
int i = getval();
if (i == 4)
{
i = 10;
}
else if (i == 10)
{
i = 4;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是有另一种方法可以做到这一点,而无需检查每个条件.
每当我尝试将'''转换为十六进制字符串时使用
string.Format("{0:X}", (int)"™");
Run Code Online (Sandbox Code Playgroud)
它返回2122这很奇怪,因为当我使用在线转换器时,我得到99.为什么?
Utils.CopyArray是Visual Basic.net中的一个方法,但它在C#中的复制是什么?我试着看msdn但没有任何线索.
我的问题是,我在DLL中有一些函数,其中一些函数是例如:
#include <string>
using namespace std;
extern "C" __declspec(dllexport) string __cdecl encryption(string s)
{
return s;
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试从C#调用此函数时,以下是使用的代码:
[DllImport("Packer.dll", EntryPoint = "encryption")]
static extern string encryption(string s);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:调用PInvoke函数'Packer'使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.
我猜我得到这个错误,因为我没有正确的功能声明任何人都可以指导我如何解决这个问题,提前谢谢
查看来自GAC的'System.IO.File.AppendAllText'代码,它调用另一个名为'InternalAppendAllText'的方法,该方法创建一个新的StreamWriter并将内容写入该文件.
//mscorlib, System.IO
private static void InternalAppendAllText(string path, string contents, Encoding encoding)
{
using (StreamWriter writer = new StreamWriter(path, true, encoding))
{
writer.Write(contents);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我做了一个for循环调用System.IO.AppentAllText 5次,例如将StreamWriter创建5次,每次迭代它是初始化和处理还是只初始化一次?
例:
for(int i = 1; i < 4; ++i)
{
System.IO.File.AppendAllText("a", "a");
}
Run Code Online (Sandbox Code Playgroud) c# ×11
c++ ×3
.net ×2
mono.cecil ×2
pinvoke ×2
compare ×1
dispose ×1
dll ×1
dllimport ×1
hex ×1
if-statement ×1
lpcstr ×1
methodbase ×1
methodinfo ×1
pointers ×1
reflection ×1
string ×1
timer ×1
vb.net ×1
winapi ×1