小编met*_*hod的帖子

如何使用MethodInfo.Invoke传递参数作为引用

如何将参数作为参考传递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)

返回的字节为空.

c# reflection methodinfo

37
推荐指数
2
解决办法
4万
查看次数

使用mono.cecil添加自定义属性?

我无法想象如何使用Mono.Cecil向方法添加自定义属性我想要添加的属性是这样的:

.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 ) 
Run Code Online (Sandbox Code Playgroud)

有谁知道如何添加自定义属性

c# mono.cecil

14
推荐指数
1
解决办法
2672
查看次数

如何设置dll的入口点

首先我认为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++ dll winapi dllimport

10
推荐指数
1
解决办法
2万
查看次数

计时器如何在.NET中工作?

我用C#编写了一个控制台应用程序,我的代码是这样的:

 while(true)
 {
 //do some stuff
     System.Threading.Thread.Sleep(60000)
 }
Run Code Online (Sandbox Code Playgroud)

我注意到我的应用程序的内存使用量大约是14k而"休眠".但后来我引用了System.Windows.Forms并使用了计时器,我发现内存使用率大幅下降.

我的问题是,在没有使用那么多内存的情况下,每隔几秒钟执行某项操作的正确方法是什么?

.net c# multithreading timer

9
推荐指数
1
解决办法
6562
查看次数

char*到C#中的字符串

我从一个返回char*指针的本机DLL调用一个函数 ,如何将返回的指针转换为字符串?我试过了 :

char* c = function();
string s = new string(c);
Run Code Online (Sandbox Code Playgroud)

但它只是返回了一个奇怪的汉字,这不是正确的价值c.

c# pointers

8
推荐指数
1
解决办法
2万
查看次数

从另一个程序集添加TypeDefinition

这个让我发疯.

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支持但不支持混合模式.

c# mono.cecil

4
推荐指数
1
解决办法
1897
查看次数

检查方法是否使用PInvoke

反正有没有检查方法是否使用PInvoke?我正在使用MethodBase循环遍历程序集中的所有方法,但我想检查该方法是否使用PInvoke.这是我正在使用的代码:

 foreach (MethodBase bases in mtd.GetType().GetMethods())
 {
      //check if the method is using pinvoke
 }
Run Code Online (Sandbox Code Playgroud)

另外,如果有可能,我怎么能检查正在使用的DLL和被调用的函数/入口点?

c# pinvoke system.reflection methodbase

4
推荐指数
1
解决办法
176
查看次数

如何比较 LPCSTR

我已经尝试过 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,如果重要的话,设置中的字符集也设置为“使用多字节字符集”。

c++ compare lpcstr

4
推荐指数
1
解决办法
7709
查看次数

如果检查则反转

我有一个巨大的检查列表,检查例如,如果整数是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)

我的问题是有另一种方法可以做到这一点,而无需检查每个条件.

c# if-statement

3
推荐指数
2
解决办法
137
查看次数

转换为十六进制?

每当我尝试将'''转换为十六进制字符串时使用

string.Format("{0:X}", (int)"™");
Run Code Online (Sandbox Code Playgroud)

它返回2122这很奇怪,因为当我使用在线转换器时,我得到99.为什么?

c# hex

2
推荐指数
1
解决办法
211
查看次数

C#中的Utils.CopyArray?

Utils.CopyArray是Visual Basic.net中的一个方法,但它在C#中的复制是什么?我试着看msdn但没有任何线索.

c# vb.net

2
推荐指数
1
解决办法
1322
查看次数

c ++中的字符串?

我的问题是,我在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签名的调用约定和参数是否与目标非托管签名匹配.

我猜我得到这个错误,因为我没有正确的功能声明任何人都可以指导我如何解决这个问题,提前谢谢

c# c++ string pinvoke

1
推荐指数
2
解决办法
1313
查看次数

在.NET中处理对象?

查看来自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)

.net c# garbage-collection dispose

1
推荐指数
1
解决办法
192
查看次数