我有这个方法,它在一个动态工厂方法中包装一个构造函数:
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
我在一个更大的代码中间有一小段代码:
int *p = new int[100];
p += 50;
delete []p;
Run Code Online (Sandbox Code Playgroud)
编译器将只删除从51内存ST位置?我认为确实如此.但是,在数组指针的情况下,编译器会保存一个附加项,该项指示已分配的对象数.那么,在这种情况下,是否应该继续删除超出分配大小的内存?或者它是否删除第51至第 100 个元素并将第1至第 50 个保留在内存中,在这种情况下可能发生内存泄漏.
我陷入困境.我的问题是在整数数组中获得最多重复的数字,该数组的值可以是0到5,000.该数字至少应重复n/4次,其中n是数组长度.
我看了提取至少n/2次重复元素.但我无法根据我的要求修改它.此外,由于我的不是字符数组,我不能创建一个5000大小的数组来增加重复数字的索引.
'No parameterless constructor found for [type]'在过去的几个小时里,我一直在努力解决这个问题.现在我创建了一个简单的单元测试,它应该反映我在应用程序中得到的内容,而且当我不这样做时,似乎抛出了这个异常stream.Position = 0.
此外,在任何情况下,当对象只是一个标准类(不是从抽象类派生)时,我都不会得到这个异常.
请参阅以下代码:
按原样运行 - 它会破坏说没有为Base找到构造函数
取消注释stream.Position = 0,它会没事的
再次注释该行,将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) 当我尝试时Imports System.Web.Script.Serialization,我在VB 2010中遇到一个错误:
警告:Imports
System.Web.Script.Serialization中指定的命名空间或类型不包含任何公共成员或无法找到.确保定义了名称空间或类型,并且至少包含一个公共成员.确保导入的元素名称不使用任何别名.
不知道为什么我不能导入它.
我是C#4的新手,特别是dynamic关键字.我已经看过很多教程,并希望自己尝试使用VS 2012 Ultimate(MSDN).
不幸的是,我似乎找不到System.Dynamic也无法添加对它的引用.我可以知道在哪里可以找到DLL System.Dynamic以及我可能做错了什么吗?
默认情况下,VS 2012已经定位到Fx 4.5,并System.Core作为参考添加.
该dynamic关键字非常常见,因此在Google中进行搜索会产生大量不相关的结果.
我已经向自己证明了编译和运行应用程序不需要命名空间.但是,不使用命名空间有哪些危险和陷阱?它创建了我试图避免的层.
我知道你在尖叫,但敏捷和抽象怎么样,所以在代码和对象之间存在20层抽象.我不是在问它是否违反了这个月或那个敏捷的东西.通过不使用命名空间来实现真实世界的问题是什么?
编辑:
创建一个独立的类dll,这样在类项目中就不会发生冲突.当我将其包含在必须使用完全限定名称的其他项目中时,试图避免.myNamespace.myClass MyClass = new myNamespace.myClass();
从评论看来,命名冲突是最大的问题.
猜猜我应该使用一个使用声明并加速...
为什么这段代码不打印"测试"?
#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) 我正在开发一个用于存储高度安全信息的Windows Phone 7项目.此数据受密码保护.如果我在另外3个CryptoStream中加密一个CryptoStream(共有4个隐藏流互相嵌入,每个使用不同的方法来生成密钥,初始化向量和盐).这种方法是否足够安全,还是需要更多的CryptoStream(每个使用256位AES加密)?
我有这个方法:
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)
检查对象是否能够响应,使其响应(如果有),否则将命令存储在字典中,以便在下次调用响应时检查并调用状态.
我有两个问题.
如何编写代码来删除委托?我不知道该怎么做.
如您所见,委托的许多内部工作依赖于方法参数.代表将如何表现?
提前致谢!
c# ×6
arrays ×2
c ×2
namespaces ×2
assembly ×1
c#-4.0 ×1
c++ ×1
cryptography ×1
delegates ×1
import ×1
memory-leaks ×1
parameters ×1
pointers ×1
protobuf-net ×1
reflection ×1
stack ×1
vb.net ×1
x86 ×1