小编Pat*_*ick的帖子

从C#类代码生成XSD注释和文档标签

使用xds.exe(或其他方法)从类生成XSD文件效果很好,但是我找不到将文档(或任何类型的描述)插入输出XSD的方法。

例如,C#类

public class Animal
{
    public int NumberOfLegs;
}
Run Code Online (Sandbox Code Playgroud)

生成XSD

<?xml version="1.0" encoding="utf-16"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Animal" nillable="true" type="Animal" />
  <xs:complexType name="Animal">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="NumberOfLegs" type="xs:int" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

但是我希望能够将XSD注释作为元数据添加到类中,因此XSD可以作为

<xs:complexType name="Animal">
  <xs:sequence>
    <xs:element minOccurs="1" maxOccurs="1" name="NumberOfLegs" type="xs:int">
      <xs:annotation>
        <xs:documentation>Will need to be greater than 0 to walk!</xs:documentation>
      </xs:annotation>
    </xs:element>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

在C#代码中是否有任何简洁的方法可以实现此目的?将任何种类的描述添加到xml元素/属性的任何方式都可以。批注必须在实际代码旁边,如下所示:

public class Animal
{
    [XmlAnnotation("Will need to be greater than 0 to walk!")]
    public int NumberOfLegs;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,需要从注释中自动记录下来。

c# xml xsd

6
推荐指数
1
解决办法
634
查看次数

在直接调用委托的情况下如何缓解“访问修改后的闭包”

我的理解是,“访问修改的闭包”警告是为了警告我从委托访问局部变量,当委托可能被存储并稍后调用或在不同的线程上调用时,局部变量实际上在以下位置不可用实际代码执行的时间。这当然是明智的。

但是,如果我正在创建一个我知道将在同一线程中立即调用的委托,该怎么办?那么就不需要警告了。例如,代码中生成警告:

delegate void Consume();

private void ConsumeConsume(Consume c)
{
    c();
}

public int Hello()
{
    int a = 0;

    ConsumeConsume(() => { a += 9; });

    a = 1;

    return a;
}
Run Code Online (Sandbox Code Playgroud)

这里不会有问题,因为ConsumeConsume总是立即调用该函数。有没有办法解决?是否有某种方法可以注释函数ConsumeConsume以指示 ReSharper 将立即调用委托?

有趣的是,当我将该ConsumeConsume(() => { a += 9; });行替换为:

new List<int>(new[] {1}).ForEach(i => { a += 9; });
Run Code Online (Sandbox Code Playgroud)

执行相同的操作,不会生成警告。这只是 ReSharper 的内置异常还是我可以做类似的事情来指示立即调用委托?

我知道我可以禁用这些警告,但这不是理想的结果。

c# resharper closures

4
推荐指数
1
解决办法
384
查看次数

挂钩功能我不知道参数

假设有一个A.DLL带有已知入口点的DLL DoStuff,我在某种程度上用我自己的DLL挂钩,fakeA.dll这样系统就会调用我的DoStuff.如何编写这样的函数,以便它可以在A.DLL不知道函数参数的情况下调用钩子DLL()的相同入口点?即我的功能fakeA.DLL看起来像

LONG DoStuff(
// don't know what to put here
)
{
    FARPROC pfnHooked;
    HINSTANCE hHooked;
    LONG lRet;

    // get hooked library and desired function

    hHooked = LoadLibrary("A.DLL");
    pfnHooked = GetProcAddress(hHooked, "DoStuff");

    // how do I call the desired function without knowing the parameters?

    lRet = pfnHooked( ??? );

    return lRet;
}
Run Code Online (Sandbox Code Playgroud)

我目前的想法是,参数在堆栈上,所以我猜我必须有一个足够大的堆栈变量(struct例如一个大屁股)来捕获任何参数,然后将它传递给pfnHooked?即

// actual arg stack limit is >1MB but we'll assume 1024 …
Run Code Online (Sandbox Code Playgroud)

c dll hook winapi

0
推荐指数
1
解决办法
356
查看次数

标签 统计

c# ×2

c ×1

closures ×1

dll ×1

hook ×1

resharper ×1

winapi ×1

xml ×1

xsd ×1