小编Abe*_*bel的帖子

如何将JIT编译的代码注入内存并执行?

"考虑一个典型的Windows x86或AMD64架构,内存分为无法写入的可执行部分和可写入但无法执行的数据部分(想想DEP)."

"JIT编译内存中的方法,(通常)不会将任何内容存储到磁盘,而是将其移动到下一个指令指针可以到达的位置,更改当前指令指针(指向JIT)以指向新生成的代码,然后执行它."

这两段虽然有点过于简单,但我基本上理解JIT和Windows的内存模型.我也知道当我尝试手动复制内存中的一些可执行代码并尝试执行它时,我通常无法做到(除非使用DLL注入).

JIT设计师是如何克服这一障碍的?他们使用ring-0驱动程序还是在用户模式下完成所有操作?

.net clr jit

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

如何在F#中解析时处理错误

我正在为f#Lexer和Parser使用fslex/fsyacc实用程序.如果输入文本的语法不正确,则必须知道它发生的位置.

可以在Lexer中确定不正确的词位(标记),如果使用了错误的符号或单词则抛出异常:

rule token = parse
          ...      
  | integer   { INT (Int32.Parse(lexeme lexbuf)) }
  | "*="      { failwith "Incorrect symbol" }
  | eof       { EOF }
Run Code Online (Sandbox Code Playgroud)

这个问题更多地与Parser(fsyacc)有关 - 如果输入文本具有正确的令牌并且被Lexer成功地标记化,但是在解析期间发生了错误(例如,错误的令牌顺序或规则中缺少令牌)

我知道如果捕获异常,这会给位置(行和列),解析失败:

try
   Parser.start Lexer.token lexbuf
with e ->
   let pos = lexbuf.EndPos
   let line = pos.Line
   let column = pos.Column
   let message = e.Message  // "parse error"
    ... 
Run Code Online (Sandbox Code Playgroud)

但是有可能(如果是 - 如何做?)也确定AST类,解析失败.

例如,是否可以在我的parser.fsy文件中编写类似于以下内容的内容:

Expression1: 
   | INT         { Int $1 }
     ...
   | _           { failwith "Error with parsing in Expression1"}
Run Code Online (Sandbox Code Playgroud)

error-handling f# parsing fsyacc

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

调试器如何获取有关初始化为null的对象的类型信息?

如果将对象初始化为null,则无法获取类型信息,因为引用不指向任何内容.

但是,当我调试并将鼠标悬停在变量上时,它会显示类型信息.只显示静态方法,但似乎仍然知道类型.甚至在发布版本中.

调试器是否使用其他信息而不仅仅是某种反射来查找数据类型?怎么知道比我更了解?如果它知道这一点,为什么它不能显示数据类型NullReferenceException

.net c# debugging

9
推荐指数
2
解决办法
491
查看次数

如何防止out-parameter结束WCF Web服务中的返回参数?

如果我的合同如下:

[OperationContract]
void DoSomething(int id, out string moreInfo);
Run Code Online (Sandbox Code Playgroud)

这最终看起来像:

string DoSomething(int id);
Run Code Online (Sandbox Code Playgroud)

导入Web服务引用时.是否有可能影响参数顺序的自动转换?在函数签名的开头找到所有out参数已经令人惊讶了,但这仍然可行,但我们希望void-methods继续作为void-methods.或者这是SOAP限制吗?

c# wcf web-services wcf-client c#-4.0

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

更改F#应用程序图标

我正在使用Visual Studio 2013开发Windows应用程序,F#但我无法更改默认应用程序图标.

我试图为font-end创建一个C#-WPF应用程序,它可以工作.但我不想将C#用于font-end.

在构建我的应用程序后我也尝试过资源黑客,但它只是不起作用.

icons f#

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

如何在catch-context中重新抛出异常时保持堆栈跟踪?

TL; DR:如何在以后引发先前捕获的异常,同时保留原始异常的堆栈跟踪.

因为我认为这对Resultmonad或计算表达式很有用,尤其是 因为该模式通常用于包装异常而不抛出异常,所以这里有一个很好的例子:

type Result<'TResult, 'TError> =
    | Success of 'TResult
    | Fail of 'TError

module Result =
    let bind f = 
        function
        | Success v -> f v
        | Fail e -> Fail e

    let create v = Success v

    let retnFrom v = v

    type ResultBuilder () =
        member __.Bind (m , f) = bind f m
        member __.Return (v) = create v
        member __.ReturnFrom (v) = retnFrom v
        member __.Delay (f) = f
        member …
Run Code Online (Sandbox Code Playgroud)

monads f# try-catch computation-expression

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

XML Schema用于具有相同名称但属性值不同的元素序列?

如何为实例文档指定XML模式,如下所示:

<productinfo>
  <!-- other stuff -->
  <informationset type="Manufacturer">
    <!-- content not relevant -->
  </informationset>
  <informationset type="Ingredients">
    <!-- content not relevant -->
  </informationset>
</productinfo>
Run Code Online (Sandbox Code Playgroud)

也就是说,一个"productinfo"元素包含两个"信息集"子节点的序列,第一个有@type="Manufacturer"第二个,第二个有@type="Ingredients"

xml xsd

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

Haskell到Clojure

我正在讨论这个关于倒计时游戏的 haskell讲​​座,我不知道任何haskell,但我对这个问题感兴趣,我正试图将他的代码移植到clojure.

这是我卡住的部分必须是我没有进入哈斯克尔的东西,


split                :: [a] -> [([a],[a])]
split []              = [([],[])]
split (x:xs)          = ([],x:xs) : [(x:ls,rs) | (ls,rs)  [([a],[a])]
nesplit               = filter ne . split

ne                   :: ([a],[b]) -> Bool
ne (xs,ys)            = not (null xs || null ys)

exprs                :: [Int] -> [Expr]
exprs []              = []
exprs [n]             = [Val n]
exprs ns              = [e | (ls,rs) 

我有自己的分裂1 2 3 4它吐出来,

(((1) (2 3 4)) ((1 2) (3 4)) ((1 2 3) (4)))
Run Code Online (Sandbox Code Playgroud)

(defn split …
Run Code Online (Sandbox Code Playgroud)

haskell clojure

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

覆盖另一个程序集中的内部抽象方法

我目前正在使用另一个.net库的ac#项目.该库(除其他外)将序列解析为树.所有项都是从抽象类继承的某种类型Sequence.我需要稍微改变行为并将Sequence自己子类化(让我们称之为MySequence).树创建后,我可以用我自己的类的对象替换一些树节点.

现在,发布了新版本的库,并Copy引入了具有以下签名的函数:

internal abstract Sequence Copy();
Run Code Online (Sandbox Code Playgroud)

我试图将我的代码用于新版本并覆盖它,但无论我做什么,我都会遇到两个错误:

MySequence没有实现继承的抽象成员' Sequence.Copy()'
和:
MySequence.Copy()':找不到合适的方法来覆盖

这是有道理的,因为它是抽象的( - >它必须被覆盖)和内部的( - >它不能被覆盖,因为来自程序集外部的隐藏可见性)

所以,问题是,我明白为什么会这样,但不知道该怎么办.对我的项目来说,子类是至关重要的Sequence.

而我也不明白的是,为什么internal abstract首先允许使用modfier,因为它基本上允许从程序集外部对整个类进行任何子类化!

有什么方法可以解决这个问题吗?通过反思或什么?

提前致谢!

.net c# overriding visibility

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

无法生成类,因为找不到具有复杂类型的顶级元素

我试图使用XSD.EXE工具从xsd文件创建一个类.但由于某种原因,我得到了这个错误.

警告:无法生成类,因为找不到具有复杂类型的顶级元素.

我在堆栈上四处看看,看到我可以在复杂类型元素上放置一个类型,但我似乎无法让我工作.这是xsd文件

    <?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
     targetNamespace="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"
     xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"
     elementFormDefault="qualified" attributeFormDefault="unqualified">

  <xs:complexType name="DocumentIdentification">
    <xs:sequence>
      <xs:element name="Standard" type="xs:string"/>
      <xs:element name="TypeVersion" type="xs:string"/>
      <xs:element name="InstanceIdentifier" type="xs:string"/>
      <xs:element name="Type" type="xs:string"/>
      <xs:element name="MultipleType" type="xs:boolean" minOccurs="0"/>
      <xs:element name="CreationDateAndTime" type="xs:dateTime"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

谢谢!

xml xsd xsd.exe

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