我目前正在开发一个应用程序,您可以使用它创建"程序"而无需编写源代码,只需单击并播放即可.
现在的问题是如何从我的数据模型生成可执行程序.有很多可能性,但我不确定哪一个对我最好.我需要生成具有类和命名空间的程序集以及可以作为应用程序一部分的所有内容.
CodeDOM类:我听说过这个类的很多限制和错误.我需要在方法参数和返回值上创建属性.这支持吗?
以编程方式创建C#源代码然后在其上调用CompileAssemblyFromFile:这可以工作,因为我可以生成我想要的任何代码,C#支持大多数CLR功能.但这不会很慢吗?
使用反射ILGenerator类:我认为我可以生成所有可能的.NET代码.但我认为这比其他方法更复杂,更容易出错?
有其他可能的解决方案吗?
编辑:该工具是开发应用程序的一般工具,它不限于特定的域.我不知道它是否可以被视为可视化编程语言.用户可以创建类,方法,方法调用,各种表达式.它不会非常有限,因为您应该能够完成实际编程语言中允许的大多数事情.目前,用户仍然必须将很多东西写成文本,但最终的目标是,几乎所有东西都可以一起点击.
我可以在VB.NET中创建一个可以在C#中使用的类:
myObject.Objects[index].Prop = 1234;
Run Code Online (Sandbox Code Playgroud)
当然我可以创建一个返回数组的属性.但要求是索引是从1开始的,而不是从0开始的,所以这个方法必须以某种方式映射索引:
我试图这样做,但C#告诉我,我不能直接调用它:
Public ReadOnly Property Objects(ByVal index As Integer) As ObjectData
Get
If (index = 0) Then
Throw New ArgumentOutOfRangeException()
End If
Return parrObjectData(index)
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
编辑 对不起,如果我有点不清楚:
C#只允许我调用这个方法
myObject.get_Objects(index).Prop = 1234
但不是
myObject.Objects[index].Prop = 1234;
这就是我想要实现的目标.
var res = new int[1000000].Skip(999999).First();
Run Code Online (Sandbox Code Playgroud)
如果此查询只使用索引器而不是遍历999999条目,那将是很好的.
我查看了System.Core.dll并注意到,与之相反Skip(),Count()扩展方法已经过优化.如果IEnumerable实现ICollection那么它只是调用Count属性.
我有一个大约1000个类的项目(不,没有办法方便地将这个项目分成多个).只需加载项目大约需要20分钟,因为智能感知会慢慢地突破所有类,并且会占用近1GB的内存.有没有办法为单个项目关闭Intellisense,但是为解决方案中的所有其他项目保留它?
如果我这样做,positionVector*worldMatrix这个位置就变成了世界空间.但是,如果我worldMatrix*positionVector以三维空间的方式()执行相反的方式会发生什么?
我注意到结果与第一个不同.我已经用谷歌搜索矩阵,数学他们解释了很多但不是这个,至少我找不到它.
我正在初始化一个带有= 0xff的无符号短整数(所有位都已设置).然后我将b分配给>> 7,它应该产生(0000 0001)并且确实如此.然而,奇怪的是,当我将c分配给<< 7时,它不等于(1000 0000).我通过输出0x80(1000 0000)和c来测试它,但它们不一样.
这是一些代码:
unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80
Run Code Online (Sandbox Code Playgroud)
我不确定问题是什么.任何帮助表示赞赏.谢谢.
PS"输出"是指输出0x80和十进制和十六进制形式的c.
我的应用程序正在将一堆相同的用户控件加载到一个ScrollPanel.问题是,这很慢.
分析器显示该方法Application.LoadComponent()在我的用户控件的构造函数中由设计器代码内部调用,是瓶颈.该方法的文档说,此方法加载XAML文件.
问题是,我如何使用BAML而不是XAML?我怎样才能实现我的用户控件的XAML在从它创建新实例时不能一次又一次地解析?还有另一种方法可以更快地加载我的用户控件吗?
我有一个名为的数据类型
public enum Gender { Male, Female }
Run Code Online (Sandbox Code Playgroud)
但有些情况我需要将性别的价值作为空的.那么如何在C#中创建可空的性别#
我在不同的地方读过人们说应该总是使用lock而不是volatile.我发现在那里有很多关于多线程的令人困惑的陈述,甚至专家对这里的一些事情也有不同的看法.
经过大量研究后,我发现锁定语句也MemoryBarriers至少会插入.
例如:
public bool stopFlag;
void Foo()
{
lock (myLock)
{
while (!stopFlag)
{
// do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我不是完全错误的话,JIT编译器可以自由地从不实际读取循环内的变量,而是只能从寄存器中读取变量的缓存版本.如果JIT对变量进行寄存器赋值,AFAIK MemoryBarriers将无法帮助,它只是确保如果我们从内存中读取该值是当前的.
除非有一些编译器魔术说"如果代码块包含一个MemoryBarrier,在MemoryBarrier被阻止后注册所有变量".
除非声明volatile或读取Thread.VolatileRead(),如果myBool从另一个Thread设置false,循环可能仍然无限运行,这是正确的吗?如果是,那么这不适用于Threads之间共享的所有变量吗?
我想显示所有客户及其地址以及订单数量和总金额。我的查询如下所示:
select *, sum(o.tota), count(o.total)
from customer c
natural join orders o
group by c.custId;
Run Code Online (Sandbox Code Playgroud)
效果很好。
但如果我向查询添加一个新表:
select *, sum(o.tota), count(o.total)
from customer c
natural join orders o
natural join cust_addresses a
group by c.custId;
Run Code Online (Sandbox Code Playgroud)
那么它就不再起作用了。聚合函数返回错误的值,因为每个客户可能有多个地址,这是正确的,我也想显示他们的所有地址。我该如何解决聚合函数问题?
我可以考虑做类似的事情:
select *, (select total from orders o where o.custid=c.custid), ..
from customer c
natural join orders o
natural join cust_addresses a
group by c.custId;
Run Code Online (Sandbox Code Playgroud)
但这非常慢。
编辑 我现在尝试了以下操作,但它告诉我字段 c.custid 未知:
select *
from
customer c,
left join (select sum(o.tota), count(o.total) from orders o where …Run Code Online (Sandbox Code Playgroud) .net ×4
c# ×4
3d ×1
baml ×1
binary ×1
bit-shift ×1
bits ×1
c ×1
codedom ×1
directx ×1
indexer ×1
intellisense ×1
linq ×1
locking ×1
math ×1
matrix ×1
nullable ×1
optimization ×1
performance ×1
project ×1
reflection ×1
select ×1
size ×1
sql ×1
sqlite ×1
vb.net ×1
volatile ×1
wpf ×1
xaml ×1
xna ×1