我正在用C#编写一个简单的桌面客户端/服务器应用程序.出于自学目的,我为通过tcp/ip套接字连接在两个应用程序之间来回发送的消息(定义为类)构建了自己的序列化系统.系统在初始化时使用反射,通过发出IL来为每种消息类型构造序列化/反序列化方法.
该系统的第一个版本使用DynamicMethod,将true传递给构造函数以允许生成的IL(在消息类型中的任意字段上操作)忽略访问权限.这很有效,人们欢欣鼓舞,但我不满意不透明的调试结果函数是多么痛苦.所以我决定放弃DynamicMethod并使用*Builder类构建一个动态程序集,我可以选择将其保存到磁盘并使用.NET Reflector等工具进行检查.
我重构了系统,然后打了一个砖墙.每当其中一个新的序列化函数尝试访问我的某个消息类型中的私有字段或方法时,我都会收到FieldAccessException或MethodAccessException.经过大量谷歌搜索和咬牙切齿之后,我想我已经将问题缩小到一个权限; 特别是我认为我动态创建的程序集缺少相对于调用/构造程序集的ReflectionPermissionFlag.MemberAccess权限(所有反射类型都在这里).
不幸的是,我似乎无法弄清楚如何修改动态程序集创建过程,以便程序集具有反射权限回到创建程序集中.DefineDynamicAssembly的权限参数似乎与限制权限相关,而不是授予权限,这使我们留下了Evidence参数.证据似乎神奇地转化为一组权限,但我找不到任何有用的例子或解释这是如何发生的.
所以我的问题是:
(1)我是否认为我的问题是对动态创建的程序集缺乏权限?
(2)如果是这样,作为调用程序集,我如何为动态程序集授予必要的权限?
当前的动态程序集创建代码:
AssemblyName assembly_name = new AssemblyName( "LCSerialization" );
assembly_name.Version = new Version( 1, 0, 0, 0 );
m_SerializationAssembly = current_domain.DefineDynamicAssembly( assembly_name, AssemblyBuilderAccess.RunAndSave ); // Fix me
m_SerializationModule = m_SerializationAssembly.DefineDynamicModule( "MainModule", "LCSerialization.dll" );
m_SerializationWrapperClass = m_SerializationModule.DefineType( "CSerializationWrapper", TypeAttributes.Public );
Run Code Online (Sandbox Code Playgroud)
请注意,我的项目是针对.NET 3.5; 文档声称.NET 4.0使用不同的安全性概念,并且不推荐使用DefineDynamicAssembly中的Evidence/PemissionSet方法.
举一个具体的例子,假设我有一个类:
[NetworkMessage]
public class CTestMessage
{
public CTestMessage( int cheeseburgers )
{
m_CheeseBurgers = cheeseburgers
}
private int m_CheeseBurgers = 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我的序列化系统,在初始化反射期间遇到这种情况时,大致会以类型= typeof(CTestMessage)粗略地完成(剪切和粘贴不可能在这里)以下内容:
MethodBuilder …Run Code Online (Sandbox Code Playgroud) 我可以为上述问题找到有效的解决方案....我试图通过这个网站找出问题http://www.ihas1337code.com/2010/11/rejection-sampling.html 但是无法得到理由idx = col +(row-1)*7; 为什么他们乘以7 ...
我们也可以这样做(rand7()*rand7())%10 ...或乘以任何其他数字,因为最后我们必须做mod 10,它只会给10个结果....
为什么他们让解决方案如此困难..请解释一下你的想法......
问题中统一意味着什么?
谢谢..
我有关于Hibernate和延迟加载的问题.
背景:我有一个Spring MVC Web应用程序,我使用Hibernate作为我的持久层.我正在使用OpenSessionInViewFilter使我能够在视图层中延迟加载实体.我正在扩展HibernateDaoSupport类并使用HibernateTemplate来保存/加载对象.一切都运作良好.到现在为止.
问题:我有一个可以通过Web请求启动的任务.当请求被路由到控制器时,控制器将为此任务创建新的Runnable并启动线程以运行任务.因此原始线程将返回并且放入ThreadLocal(通过OpenSessionInViewFilter)的Hibernate会话不可用于Task的新线程.因此,当任务执行某些数据库操作时,我会得到臭名昭着的LazyInitializationException.
任何人都可以建议我可以为任务提供Hibernate会话的最佳方法吗?
谢谢阅读.
在尝试做类似于Alex Martelli 的ActiveState配方标题为Python中的Constants时,我遇到了意外的副作用(在Python 2.7中),它将类实例分配给sys.moduleshas中的一个条目- 即显然这样做更改__name__to 的值,None如下面的代码片段所示(它会破坏配方中的部分代码):
class _test(object): pass
import sys
print '# __name__: %r' % __name__
# __name__: '__main__'
sys.modules[__name__] = _test()
print '# __name__: %r' % __name__
# __name__: None
if __name__ == '__main__': # never executes...
import test
print "done"
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样.我不相信它在Python 2.6和早期版本中是这样的,因为我有一些较旧的代码,显然if __name__ == '__main__':条件在赋值后按预期工作(但不再有).
FWIW,我也注意到这个名字在分配后也会_test从一个类对象反弹None回来.我觉得很奇怪他们正在反弹None而不是完全消失......
更新:
我想补充一点,任何实现效果的变通办法if __name__ == '__main__':都会受到高度赞赏.TIA!
我在字符串中有浮点数.有一个问题.数字使用"." 不是","作为小数点.
此代码无效:
MyNumber = float.Parse("123.5");
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用字符串替换功能在解析之前"修复"此字符串.
MyNumber = float.Parse("123.5".Replace('.',',');
Run Code Online (Sandbox Code Playgroud)
但还有其他办法吗?
我已经实现了一个订阅/发布(为了我自己的享受)WCF服务,它运作得相当好.像我见过的所有博客和书籍一样,他们都OperationContext用来获取客户回调地址.经过一些阅读,由于很多人说不使用OperationContext,我发现自己无法创建适当的单元测试.然而,我还没有找到替代方案.我想订阅方法可以接受一个参数来提供它自己的地址吗?从集成测试站的角度来看,我可以看到代码是可测试的,但是不能用于单元测试,因为它OperationContext总是为空.
如何在不使用订阅我的服务的情况下获取客户端点OperationContext?
除了一点点,但在显示代码示例时,哪里有一个好的WCF资源并考虑了测试?有大量的博客在没有提供样本测试用例的情况下重复相同的代码.
谢谢.
这是关于Linux中的C语言.
我fork()在main()哪里创建了2个子进程.然后,在两个子进程中运行一个函数abc(),其中有一个局部变量x.我在里面写了一些价值.然后我打印这个变量的地址printf("%p",&x).
两个进程都打印SAME地址.我以为每个孩子都得到父母记忆的(独立)副本.我需要每个进程都有自己的变量x.我怎么能这样做或者我做错了什么?
如何在lua中播放声音?有什么简单的技巧怎么做?
我的目标是在玩我的游戏时玩一些ogg(或mp3)文件,这是用lua编程的.它在Windows上运行.
如何使用PIL在透明背景中转换png或jpg图像的所有白色背景和白色元素?
我正在读这篇文章,这里有一个代码示例:
struct X {
static bool f( int* p )
{
return p && 0[p] and not p[1:>>p[2];
};
};
Run Code Online (Sandbox Code Playgroud)
问题是:兼容编译器应该提供多少错误:
我回答了一个,因为这段代码相当于
struct X {
static bool f( int* p )
{
return p && p[0] && ! p[1] > p[2];
};
};
Run Code Online (Sandbox Code Playgroud)
而且我认为静态函数定义之后的分号将是一个错误.但萨特先生说0并解释(除了我所理解的事情)
函数声明结束时允许使用"额外"分号.
我的问题是:
分号是否可以出现在两个成员之间或类定义中的任何其他位置,如
struct X
{
int a;;;;int b; //Legal?
};
Run Code Online (Sandbox Code Playgroud)