小编Wat*_* v2的帖子

检测到CallbackOnCollectedDelegate

我是一个应用程序的子类.我的子类Window过程在DLL中.我在DLL中的子类代码看起来有点像这样(剥离,删除其他不相关的部分).

class FooBar
{
  private delegate int WndProcDelegateType(IntPtr hWnd, int uMsg, 
                                           int wParam, int lParam);

  private const int GWL_WNDPROC = (-4);
  private static IntPtr oldWndProc = IntPtr.Zero;
  private static WndProcDelegateType newWndProc = new 
                                                  WndProcDelegateType(MyWndProc);

  internal static bool bHooked = false;

  [DllImport("user32.dll")]
  private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, 
                                             WndProcDelegateType dwNewLong);

  [DllImport("user32.dll")]
  private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, 
                                             IntPtr dwNewLong);


  [DllImport("user32")]
  private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, 
                                           int Msg, int wParam, int lParam);

  private static int …
Run Code Online (Sandbox Code Playgroud)

c# winapi unmanaged

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

将可空类型转换为非可空类型?

我有一堆具有可空属性的bean,如下所示:

package myapp.mybeans;

data class Foo(val name : String?);
Run Code Online (Sandbox Code Playgroud)

我在全球空间中有一个方法,如下所示:

package myapp.global;

public fun makeNewBar(name : String) : Bar
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

在其他地方,我需要Bar从内部的东西中制作一个Foo.所以,我这样做:

package myapp.someplaceElse;

public fun getFoo() : Foo? { }
...
val foo : Foo? = getFoo();

if (foo == null) { ... return; }


// I know foo isn't null and *I know* that foo.name isn't null
// but I understand that the compiler doesn't.
// How do I convert String? to String …
Run Code Online (Sandbox Code Playgroud)

kotlin

15
推荐指数
2
解决办法
7372
查看次数

IEnumerable <T>.即使定义了一个显式的强制转换运算符,它也不会工作?

我有一个从类型Bar到类型定义的显式转换Foo.

public class Bar
{
  public static explicit operator Foo(Bar bar)
  {
    return new Foo(bar.Gar);
  }
}

public class Foo
{
  public string Gar { get; set; }

  public Foo() { }

  public Foo(string gar) { Gar = gar; }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时:

using System.Linq;

...

var manyFoos = manyBars.Cast<Foo>();
Run Code Online (Sandbox Code Playgroud)

它抛出一个异常,说它无法施放.

如何判断Cast使用我的演员操作符来尝试转换?

c#

14
推荐指数
4
解决办法
2063
查看次数

.NET线程是否与操作系统线程不同?

  1. .NET线程是轻量级用户模式线程还是内核模式操作系统线程?

  2. 另外,保留SQL Server,.NET线程和操作系统线程之间是否存在一对一的对应关系?

我也很感兴趣,因为Thread具有对称对命名方法的类BeginThreadAffinityEndThreadAffinity,其文档巧妙地表明,.NET线程是在真正的操作系统线程轻量级的抽象.

此外,我刚才读到一些堆栈溢出线程本身,微软试图在CLR中维护这种分离,就像SQL Server一样.我记得有一些项目正在使用Fiber API来实现这个目的,但我不能说我理解了所读的所有细节.

我想要一些关于这个主题的更详细的文献,比如.NET线程的内部结构与Windows创建的线程的内部结构相比.虽然有很多关于Windows创建的线程结构的信息,但Jeffrey Richter的高级Windows编程书是其中一个来源,例如,我找不到任何专门用于.NET线程内部结构的文献.

有人可能会争辩说,这些信息可以在.NET源代码中找到,现在可以公开使用,或者使用反汇编程序,如Reflector或IL Spy,但我没有看到任何代表线程控制块(TCB)和程序的信息.计数器(PC)和堆栈指针(SP)或线程的等待队列,或者线程当前是Thread该类中成员的队列列表.

我在哪里可以读到这个?文档中是否提到了它的任何内容?我已经从MSDN上阅读了所有这些页面,但它们似乎没有提到它.

.net c# clr multithreading

14
推荐指数
1
解决办法
1370
查看次数

在C#中引用和输出参数,不能标记为变体

该陈述是什么意思?

从这里

在C#中引用和输出参数,不能标记为变体.

1)是否意味着不能做以下事情.

public class SomeClass<R, A>: IVariant<R, A>
{
    public virtual R DoSomething( ref A args )
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

2)或者它是否意味着我不能拥有以下内容.

public delegate R Reader<out R, in A>(A arg, string s);

public static void AssignReadFromPeonMethodToDelegate(ref Reader<object, Peon> pReader)
{
    pReader = ReadFromPeon;
}

static object ReadFromPeon(Peon p, string propertyName)
    {
        return p.GetType().GetField(propertyName).GetValue(p);
    }

static Reader<object, Peon> pReader;

static void Main(string[] args)
    {
        AssignReadFromPeonMethodToDelegate(ref pReader);
        bCanReadWrite = (bool)pReader(peon, "CanReadWrite");

        Console.WriteLine("Press any key to quit...");
        Console.ReadKey();
    }
Run Code Online (Sandbox Code Playgroud)

我试过(2)并且它有效.

c# covariance contravariance variance

13
推荐指数
1
解决办法
3039
查看次数

为什么有List <T> .BinarySearch(...)?

我正在看List,我看到一个带有一些重载的BinarySearch方法,我不禁想知道在List中有这样的方法是否有意义?

除非列表已排序,否则为什么我要进行二进制搜索?如果列表没有排序,调用该方法只会浪费CPU时间.在List上使用该方法有什么意义?

c# collections list binary-search

13
推荐指数
4
解决办法
9357
查看次数

无法解析程序集Model.dll

我有一个使用Entity Framework的类库项目,它运行良好,直到我将模型移动到一个单独的类库类型项目.

在我将模型移到一个名为Model的单独的类库项目之后,我将app/web.config中的连接字符串更改为如下所示:

<add name="GlobalizationEntities" 
connectionString="metadata=res://Model.dll/Models.ResourceGlobalizationModel.csdl|
res://Model.dll/Models.ResourceGlobalizationModel.ssdl|
res://Model.dll/Models.ResourceGlobalizationModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
Data Source=MyComputer\sqlexpress;
Initial Catalog=DaDatabase;
Integrated Security=true;
MultipleActiveResultSets=True&quot;" 
providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

(为了便于阅读,我在上面的代码段中包含了换行符.我的代码没有这些换行符.)

现在,我的解决方案结构如下所示:

在此输入图像描述

但是,我FileNotFound在运行时获得一个异常,其内容如下:

System.IO.FileNotFoundException was unhandled by user code
  HResult=-2147024894
  Message=Unable to resolve assembly 'Model.dll'.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.ResolveAssemblyName(String assemblyName, MetadataArtifactAssemblyResolver resolver)
       at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
       at System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
       at System.Data.Metadata.Edm.MetadataCache.SplitPaths(String paths)
       at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0()
       at System.Data.Common.Utils.Memoizer`2.Result.GetValue()
       at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg)
       at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) …
Run Code Online (Sandbox Code Playgroud)

.net reflection entity-framework

13
推荐指数
2
解决办法
6166
查看次数

英特尔32位和64位寄存器的名称中E和R前缀代表什么?

32位寄存器名称以E开头,64位寄存器以R开头.E和R代表什么?是否有理由选择这些字母?

此外,在64位寄存器中,我们也可以在任何低级调试器(如Windbg)中看到,最右边的位仍然用与64位寄存器相同的名称引用,除了名称以E.例如,64位系统中RAX寄存器的最右边32位称为EAX.

那么,E和R代表什么?而且,为什么后缀X用于注册?

64-bit x86 assembly x86-64 cpu-registers

13
推荐指数
1
解决办法
3294
查看次数

获取所有引用程序集的路径

如何获取当前正在执行的程序集引用的所有程序集的路径?GetReferencedAssmblies()给了我AssemblyName[].我如何从那里到达它们的装载位置?

c# reflection

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

C#等效的VB 6 DoEvents

VB6有一个DoEvents()方法,您调用该方法将控制权返回给操作系统并模拟该单线程环境中的多线程行为.

VB 6 DoEvents()的.NET框架是什么?

.net c# vb.net vb6

12
推荐指数
3
解决办法
8033
查看次数