小编sta*_*ica的帖子

为什么这个DynamicMethod(ldarg.1,newobj,ret)会触发VerificationException?

我有这个方法,它在一个动态工厂方法中包装一个构造函数:

static Func<TArg1, TResult> ToFactoryMethod<TArg1, TResult>(this ConstructorInfo ctor)
    where TResult : class
{
    var factoryMethod = new DynamicMethod(
         name:           string.Format("_{0:N}", Guid.NewGuid()),
         returnType:     typeof(TResult), 
         parameterTypes: new Type[] { typeof(TArg1) });

    ILGenerator il = factoryMethod.GetILGenerator();
    il.Emit(OpCodes.Ldarg_1);
    il.Emit(OpCodes.Newobj, ctor);
    il.Emit(OpCodes.Ret);

    return (Func<TArg1, TResult>)
         factoryMethod.CreateDelegate(typeof(Func<TArg1, TResult>));
}
Run Code Online (Sandbox Code Playgroud)

但是,下面的代码抛出一个VerificationException.Invoke(…):

ConstructorInfo ctor = typeof(Uri).GetConstructor(new Type[] { typeof(string) });
Func<string, Uri> uriFactory = ctor.ToFactoryMethod<string, Uri>();
Uri uri = uriFactory.Invoke("http://www.example.com");
Run Code Online (Sandbox Code Playgroud)

如果我更换ldarg.1,则不会抛出异常; newobj <ctor>ldnull,所以这个问题必须由这两个IL指令造成的.进一步的实验表明错误在于ldarg.1.(我用ldstr <string>上面的具体例子替换了它.)

有谁看到这些IL指令有什么问题?

c# reflection reflection.emit dynamicmethod verificationexception

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

内存泄漏与否?

我在一个更大的代码中间有一小段代码:

int *p = new int[100];
p += 50;
delete []p;
Run Code Online (Sandbox Code Playgroud)

编译器将只删除从51内存ST位置?我认为确实如此.但是,在数组指针的情况下,编译器会保存一个附加项,该项指示已分配的对象数.那么,在这种情况下,是否应该继续删除超出分配大小的内存?或者它是否删除第51至 100 元素并将第1至 50 保留在内存中,在这种情况下可能发生内存泄漏.

c++ arrays pointers memory-leaks

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

计算数组元素的出现次数

我陷入困境.我的问题是在整数数组中获得最多重复的数字,该数组的值可以是0到5,000.该数字至少应重复n/4次,其中n是数组长度.

我看了提取至少n/2次重复元素.但我无法根据我的要求修改它.此外,由于我的不是字符数组,我不能创建一个5000大小的数组来增加重复数字的索引.

c arrays

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

尝试读取流结束时没有无参数构造函数异常

'No parameterless constructor found for [type]'在过去的几个小时里,我一直在努力解决这个问题.现在我创建了一个简单的单元测试,它应该反映我在应用程序中得到的内容,而且当我不这样做时,似乎抛出了这个异常stream.Position = 0.

此外,在任何情况下,当对象只是一个标准类(不是从抽象类派生)时,我都不会得到这个异常.

请参阅以下代码:

  1. 按原样运行 - 它会破坏说没有为Base找到构造函数

  2. 取消注释stream.Position = 0,它会没事的

  3. 再次注释该行,将Derived类更改为不从Base继承并取消注释类中的唯一属性,运行它 - 它不会中断(但显然Name将为null)

有人可以解释为什么这样工作吗?为什么#1抛出(或为什么#3没有)以及为什么这条消息?

[Test]
public void CanSerialize_Derived()
{
    var derived = new Derived() {Name = "ngf"};
    var stream = new MemoryStream();
    Serializer.Serialize(stream, derived);
    //stream.Position = 0;
    var deserializedInstance = Serializer.Deserialize<Derived>(stream);
}

[ProtoContract]
[ProtoInclude(9, typeof(Derived))]
public abstract class Base 
{
    [ProtoMember(1)]
    public string Name { get; set; }
}

[ProtoContract]
public class Derived : Base
{
    //[ProtoMember(1)]
    //public string Name { …
Run Code Online (Sandbox Code Playgroud)

c# protobuf-net

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

无法导入`Imports System.Web.Script.Serialization`

当我尝试时Imports System.Web.Script.Serialization,我在VB 2010中遇到一个错误:

警告:Imports System.Web.Script.Serialization中指定的命名空间或类型不包含任何公共成员或无法找到.确保定义了名称空间或类型,并且至少包含一个公共成员.确保导入的元素名称不使用任何别名.

不知道为什么我不能导入它.

vb.net import namespaces visual-studio-2010

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

如何将"System.Dynamic"添加到我的项目中?

我是C#4的新手,特别是dynamic关键字.我已经看过很多教程,并希望自己尝试使用VS 2012 Ultimate(MSDN).

不幸的是,我似乎找不到System.Dynamic也无法添加对它的引用.我可以知道在哪里可以找到DLL System.Dynamic以及我可能做错了什么吗?

默认情况下,VS 2012已经定位到Fx 4.5,并System.Core作为参考添加.

dynamic关键字非常常见,因此在Google中进行搜索会产生大量不相关的结果.

c# dynamic-language-runtime c#-4.0

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

不使用C#名称空间有什么危险?

我已经向自己证明了编译和运行应用程序不需要命名空间.但是,不使用命名空间有哪些危险和陷阱?它创建了我试图避免的层.

我知道你在尖叫,但敏捷和抽象怎么样,所以在代码和对象之间存在20层抽象.我不是在问它是否违反了这个月或那个敏捷的东西.通过不使用命名空间来实现真实世界的问题是什么?

编辑:

创建一个独立的类dll,这样在类项目中就不会发生冲突.当我将其包含在必须使用完全限定名称的其他项目中时,试图避免.myNamespace.myClass MyClass = new myNamespace.myClass();

从评论看来,命名冲突是最大的问题.

猜猜我应该使用一个使用声明并加速...

c# namespaces

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

如何更改处理器堆栈?

为什么这段代码不打印"测试"?

#include <stdio.h>
#include <stdlib.h>

void foo ( void ) {
   printf("test\n");
}

__declspec(naked)
void bar ( void ) {
   asm {
      push 0x000FFFFF
      call malloc
      pop ecx
      push eax
      add eax, 0x000EFFFF

      mov ecx, esp
      mov esp, eax
      push ecx

      call foo

      pop esp
      call free
      pop ecx
      ret
   }
}

int main(int argc, char* argv[])
{
   bar();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c x86 assembly stack stack-pointer

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

将一个CryptoStream封装在其他几个中可以提高安全性吗?

我正在开发一个用于存储高度安全信息的Windows Phone 7项目.此数据受密码保护.如果我在另外3个CryptoStream中加密一个CryptoStream(共有4个隐藏流互相嵌入,每个使用不同的方法来生成密钥,初始化向量和盐).这种方法是否足够安全,还是需要更多的CryptoStream(每个使用256位AES加密)?

c# cryptography windows-phone-7

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

代表中的方法参数

我有这个方法:

public override void respond(params string[] resargs)
{
    foreach (command cmd in pndgcmds)
    {
        cmd(this);
    }

    if (objs[resargs[0]].status)
        objs[resargs[0]].request(resargs);
    else
    {
        pndgcmds.Add(
            (myclass master) =>
            {
                if (master.objs[resargs[0]].status != true) return;
                master.objs[resargs[0]].request(resargs);
                //code to remove the delegate
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

检查对象是否能够响应,使其响应(如果有),否则将命令存储在字典中,以便在下次调用响应时检查并调用状态.

我有两个问题.

  1. 如何编写代码来删除委托?我不知道该怎么做.

  2. 如您所见,委托的许多内部工作依赖于方法参数.代表将如何表现?

提前致谢!

c# parameters delegates

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