小编Cra*_*gTP的帖子

具有InternalCall属性的C#内部静态extern - 内部还是外部?

在我问的另一个问题中,出现了一条评论,表明.NET框架的Array.Copy方法使用了非托管代码.我用Reflector挖掘并发现Array.Copy方法重载的签名之一定义如下:

[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);
Run Code Online (Sandbox Code Playgroud)

看了这个之后,我有点困惑.我混淆的来源是extern修饰符,意思是(MSDN链接):

extern修饰符用于声明从外部实现的方法.

但是,方法声明也用一个MethodImplOptions.InternalCall属性来装饰,它表示(MSDN链接):

指定内部调用.内部调用是对在公共语言运行时本身内实现的方法的调用.

任何人都可以解释这个看似明显的矛盾吗?

.net c#

34
推荐指数
2
解决办法
7942
查看次数

为什么.NET框架中没有托管的MD5实现?

(重写的问题,请看原始的历史).

问题就在标题中.

为什么.NET框架中没有托管的MD5实现?

我特别谈到MD5算法的纯托管代码实现,它在.NET框架中不存在.

在System.Security.Cryptography命名空间内,我知道MD5抽象基类(必须继承并且不能按原样使用),而且我也知道MD5CryptoServiceProviderMD5CNG都提供了来自然而,OS的底层CSP(加密服务提供商)和CNG(加密下一代)提供商都是非托管代码.

答案更新:
我很欣赏,虽然这个问题应该有 "一个真正的答案",但我们(SO社区)可能不知道它,除非Microsoft框架设计师(或直接认识一个人)是该社区的一部分,然而,很多人提出了非常合理的"有根据的猜测",从框架中省略了管理MD5实现的想法,但是,我仍然很想知道是否有人确实知道这个问题的"真实"答案.

.net hash cryptography

11
推荐指数
2
解决办法
5030
查看次数

如何让Entity Framework初始化我新创建的实体上的集合?

我正在尝试用一些IDatabaseIntialiser像这样的测试数据为我的数据库播种:

protected override void Seed(BlogDataContext context)
{
    // <snip>
    var post = context.Posts.Create();
    post.Title = "My Life On Twitter";
    // <snip properties>

    // Set tags
    post.Tags.Add(aspnetTag); // NullRefException
    post.Tags.Add(razorTag);
Run Code Online (Sandbox Code Playgroud)

Post实体看起来像这样:

public class Post
{
    // ...
    public virtual ICollection<Tag> Tags { get; set; }
Run Code Online (Sandbox Code Playgroud)

Bitbucket的完整实体:帖子标签.所有代码均在http://code.dantup.com/blog

但是,post.Tags为null,所以这不起作用.最初我是创建帖子new Post(),但是因为我正在调用CreateEF提供的方法,为什么集合没有初始化?

在这里实例化我自己的集合感觉很笨拙,如果我在构造函数中这样做,大概每次我从EF加载一个实体时,它都会在构造函数中创建集合,然后用一个包含实际数据的集合覆盖它. D B?

有没有办法告诉EF为我创建一个实体,包括我的集合/代理ICollections(假设ICollection是正确的选择)?

编辑:context.Configuration.ProxyCreationEnabled设置为true(默认情况下),这似乎是存在的原因

.net asp.net-mvc entity-framework sql-server-ce ef-code-first

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

5
推荐指数
1
解决办法
5422
查看次数

SQLite加密在平台之间有所不同

我从源代码构建了几个dll.它们主要来自同一个源,sqlite-3.6.22,Open SSL 0.9.8和sqlcipher.

我构建两个的原因是我需要一个用于处理C++项目,一个用作java的JDBC驱动程序(所以java jni dll).

现在我有两个DLL,我可以用C++和C#编写和创建数据库(使用C语言),在java中也是如此.这两个响应正如我所料,你可以打开它们,如果你给出正确的密码,它会失败,如果你给错了,等等.理论上应该是sqlcipher的默认值,它是硬编码到aes-256-cbc .但是,我无法打开一个用另一个制作的数据库.我可以在SQLite3 Management studio中打开一个用c版本创建的数据库,但是只有在我选择了RSA的密码时,我才能打开在java中创建的其他任何东西.

另一件事是,如果我使用c数据库创建两个具有相同内容的数据库,则它们是字节相同的字节,而java则不是.

我确信我做了一些明显错误的事情,但我真的看不到它 - 据我所知,java工作正常(因某些原因更容易调试).

c c# java sqlite

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

在集合/对象初始化程序中使用Random.Next()

任何人都可以解释为什么下面的代码运行时偶尔会导致一些"NULL!" 字符串被写入控制台窗口?

(这是TL; DR问题,请继续阅读以获取更多详情)

这不会每次都发生,您可能需要运行此代码几次,但很快,您将看到一串"NULL!" 输出到控制台窗口而不是数字.

本质上,它正在初始化(使用简写集合初始化程序语法)用户定义类型()的通用集合,List<Thing>其中包含一个属性,该属性是对另一个用户定义类型(Numb)的引用. Numb在它自己的集合中预定义,nnn并使用简化对象初始化程序语法集合初始化程序中使用lambda 创建该集合中的对象,使用lambda根据其唯一num属性选择随机对象.

nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()不应该返回一个NULL对象(即默认部分FirstOrDefault())作为随机数应该永远只选择1或2,这两者存在的内nnn集合.

我的怀疑告诉我这与在对象/集合初始化器场景中使用调用(特别是多次调用)有关rnd.Next().

代码(作为控制台应用程序运行):

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();

            var nnn = new List<Numb> {
                new Numb() {
                    num = 1
                },
                new Numb() {
                    num = 2 …
Run Code Online (Sandbox Code Playgroud)

c# random collections initialization

3
推荐指数
1
解决办法
635
查看次数

创建一个可以在C#中处理多个返回类型的函数

我对C#相对较新,在VB6中完成了我以前的大部分编程工作.我知道C#比VB更明确地键入,但我希望有一个解决我的问题的方法.

我正在开发一个项目,旨在打开,解析,验证并最终编辑5个不同的CSV文件,这些文件用作我们使用的应用程序的输入.手动操作CSV文件是现在所做的,但由于缺乏原始开发人员的文档和支持,大多数用户都很难.我的目标是构建一个GUI,允许用户直接编辑字段并创建一个新的CSV文件用作导入.这是现在的基本结构:

public class Dataset
{
    public Dictionary<string,File1> file1 = new Dictionary<string,File1>();
    public Dictionary<string,File2> file2 = new Dictionary<string,File2>();
    public Dictionary<string,File3> file3 = new Dictionary<string,File3>();
    public Dictionary<string,File4> file4 = new Dictionary<string,File4>();
    public Dictionary<string,File5> file5 = new Dictionary<string,File5>();

    public void SelectFiles()
    {
        //User specifies which file(s) are to be opened (default is all 5 files)
    }

    public class File1
    {
        public string Field_1 {get ; set}
        public string Field_2 {get ; set}
        .
        .
        .
        public string Field_10 {get ; set}
    } …
Run Code Online (Sandbox Code Playgroud)

c# c#-3.0

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