我很困惑AccessViolationException.这是相当IM可能(请参阅回答)有一个干净的再现,但在这里不用的总体思路:
class MyClass 
{
  public List<SomeType> MyMethod(List<string> arg)
  {
     // BREAKPOINT here
     // Simple stuff here, nothing fancy, no external libs used
  }
}
delegate List<SomeType> MyDelegate(List<string> arg);
... 
var myObject = new MyClass();
Func<List<string>, List<SomeType>> myFunc = myObject.MyMethod;
MyDelegate myDelegate = myObject.MyMethod;
myFunc(null)            // works fine
myDelegate(null)        // works fine
myObject.MyMethod(null) // throws AccessViolationException
Run Code Online (Sandbox Code Playgroud)
奇怪的是我没有使用任何不安全的代码.我对任何地方(以及整个程序执行AFAIK中的任何地方)的外部库都没有任何依赖关系.
最奇怪的部分是这是100%可重复的,甚至在稍微重构代码之后,将方法调用移到别处,在它之前放置额外的代码等等 - 在所有情况下AccessViolationException仍然抛出特定的方法调用.直接调用时不会输入该方法(未点击断点).通过委托调用它或Func<>工作正常.
关于什么可能导致它或如何调试它的任何线索?
UPDATE
在antiduh的问题之后:在任何地方都没有从构造函数调用虚方法.发生这种情况时的实际堆栈跟踪非常简单,只需要两个静态方法和一个简单实例.
唯一的线索似乎是线程.在程序执行(而不是在调用堆栈中)之前Parallel.ForEach()和之前都会Thread.Sleep()调用它.关于错误处理线程(使用常规托管类)如何导致AVE的任何线索? …
在一个高度多线程的场景中,我遇到了特定EF查询的问题.它通常便宜又快速:
Context.MyEntity
  .Any(se => se.SameEntity.Field == someValue        
     && se.AnotherEntity.Field == anotherValue
     && se.SimpleField == simpleValue
     // few more simple predicates with fields on the main entity
     );
Run Code Online (Sandbox Code Playgroud)
这编译成一个非常合理的SQL查询:
SELECT 
CASE WHEN ( EXISTS (SELECT 
    1 AS [C1]
    FROM   (SELECT [Extent1].[Field1] AS [Field1]
        FROM  [dbo].[MyEntity] AS [Extent1]
        INNER JOIN [dbo].[SameEntity] AS [Extent2] ON [Extent1].[SameEntity_Id] = [Extent2].[Id]
        WHERE (N'123' = [Extent2].[SimpleField]) AND (123 = [Extent1].[AnotherEntity_Id]) AND -- further simple predicates here -- ) AS [Filter1]
    INNER JOIN [dbo].[AnotherEntity] AS [Extent3] ON [Filter1].[AnotherEntity_Id1] …Run Code Online (Sandbox Code Playgroud) 我正在Unity IoC中实现动态加载和注册我的程序集.
鉴于这些类:
public interface IA { }
public interface IB { }
public interface IC { }
public class A : IA { }
public class B : IB
{
    public B(IA a) { }
}
public class C : IC
{
    public C(IB b) { }
}
Run Code Online (Sandbox Code Playgroud)
而这个配置:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
    AllClasses.FromAssemblies(assembly),
    WithMappings.FromAllInterfacesInSameAssembly,
    WithName.Default,
    WithLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)
代码:
var c = container.Resolve(typeof(IC));
Run Code Online (Sandbox Code Playgroud)
抛出:
Microsoft.Practices.Unity.dll中出现"Microsoft.Practices.Unity.ResolutionFailedException"类型的第一次机会异常
附加信息:依赖项的解析失败,type ="MyAsm.IC",name ="(none)".
在解决时发生异常:
例外情况是:InvalidOperationException - 类型IC没有可访问的构造函数.
在例外时,容器是:
MyAsm.IC,(无)
所有上述代码都在同一个程序集MyAsm中执行.在调试中分析容器,该Registrations属性列出了似乎正确的映射集合A, …
我正在从头开始构建一个新项目.我创建了一个db,我一直在应用db结构,我用一个简短的不言自明的例子来解释:
表项 - >(Id,Name) - >包含一般信息
表ItemInfo - >(Item_Id,语言,描述) - >包含语言相关信息.
Id和Item_Id与外键关系连接.
我的想法是以一种最终只使用通过实体框架填充的单个POCO对象"Item"的方式对其进行建模.此对象仅包含公共属性:Id,Name和Description.语言将使用此对象隐藏到代码中,对象本身应负责根据包含该语言的全局变量提供正确的描述.
我已经尝试了几种方法来做到这一点并且总是遇到问题,因为实体框架不允许这种情况.我总是必须检索所有语言的信息,而不仅仅是当前语言或使用2个不同的查询.
所以最后我开始使用的解决方案是让T4模板同时创建Item和ItemInfo,然后手动添加类似于此的代码:
public partial class Item
{
    private ItemInfo _itemInfo = null;
    private ItemInfo itemInfo
    {
        get
        {
            if (_itemInfo == null) _itemInfo = ItemInfoes.Single(p => p.Language == GlobalContext.Language);
            return _itemInfo;
        }
    }
    public Description 
    {
        get { return itemInfo.Description; } 
        set { itemInfo.Description = value;}
    }
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我将ItemInfo中的其他属性添加到Item,并根据我的要求选择了正确的语言.你认为这是一个很好的解决方案吗?你会如何解决这个问题呢?
但是,运行sql profiler我可以看到2个不同的sql查询用于填充Item对象,一个查询Item表,另一个查询ItemInfo.
使用单个查询在两个表之间进行连接可以实现相同的方案吗?(我担心长期性能受到影响,这也就是我如何在没有ORM的情况下做到这一点).
任何建议都会受到欢迎,我有多年的编程经验,但我是Entity Framework和ORMs的新手.
请帮忙.
c# multilingual linq-to-entities entity-framework entity-framework-4
我有一个使用Autofac的IoC设置并使用AoP拦截器.
通常,我使用这样注册的接口拦截器:
var builder = new ContainerBuilder();
builder.RegisterType<MyType>()
    .As<IMyType>()
    .UsingConstructor(new Type[0])
    .EnableInterfaceInterceptors()
    .InterceptedBy(typeof(MyInterceptor));
Run Code Online (Sandbox Code Playgroud)
它有效.但由于某些原因(在这个最小的例子中不明显),我需要注册一个类并将其注入为self(不是通过接口),所以我尝试:
var builder = new ContainerBuilder();
builder.RegisterType<MyType>()
    .As<IMyType>()
    .AsSelf()
    .UsingConstructor(new Type[0])
    .EnableClassInterceptors()
    .InterceptedBy(typeof(MyInterceptor));
Run Code Online (Sandbox Code Playgroud)
在此设置中,拦截器永远不会被触发.当我在debug中检查注入的依赖项时,它似乎确实是一个子类代理(应该如此),但它的_interceptors私有属性只包含一个实例Castle.DynamicProxy.StandardInterceptor,这显然不是我配置的.
事实上,如果我删除AsSelf()它仍然没有拦截,这导致我得出一个结论,要么我做错了,或者类拦截根本不起作用......?
UPDATE
MyType实际上是从EF继承的DbContext,我试图拦截SaveChanges(),这是虚拟的.只是为了测试我添加了public virtual void Foo()哪些也没有截获.
UPDATE
我之前忽略了这一点,并简化了跳过一个重要的事实:我UsingConstructor()在注册中指定.现在我凭经验发现UsingConstructor()似乎阻止EnableClassInterceptors()了工作.
我正在使用的完整注册:
    builder.RegisterType<FooClass>()
        .AsSelf()
        .InstancePerRequest()
        .EnableClassInterceptors()
        .UsingConstructor(new Type[0]) // commenting this out solves the issue
        .InterceptedBy(typeof(MyInterceptor));
public class FooClass
{
    public virtual void Bar()
    {
        Debugger.Break();
    }
    public …Run Code Online (Sandbox Code Playgroud) 简短:是否符合标准,RESTful和其他好主意,以启用PATCH请求来更新资源集合,而不仅仅是单个资源,但仍然是单独的?
长:
我正在考虑公开一种方法,用于对我的资源集合进行批量,原子更新.例:
PATCH /url/myresources
[
    {
        "op": "add",
        "path": "/1",  // ID if the individual resource
        "value": 
        {
            ... full resource representation ...
        }
    },
    {
        "op": "remove",
        "path": "/2"
    },
    {
        "op": "replace",
        "path": "/3/name",
        "value": "New name"
    }
]
Run Code Online (Sandbox Code Playgroud)
上下文是商业解决方案的公共API.允许这样的PATCH的好处是原子性和批量友好性,没有垃圾邮件请求,单独处理故障等.
我已经咨询了https://tools.ietf.org/html/rfc6902和http://tools.ietf.org/html/rfc5789但是如果符合要求则无法找到明确的答案.RFC主要是指"资源",但也可以将资源集合视为"资源".
这是一个好主意吗?还有更好的选择吗?
我使用绑定到使用CanExecute委托初始化的RelayCommands的几个按钮.
RelayCommand DeleteCommand;
bool CanDelete()
{
    return BoolProp1 && BoolProp2;
}
...
DeleteCommand = new RelayCommand(Delete, CanDelete);
Run Code Online (Sandbox Code Playgroud)
BoolProp1并且BoolProp2是正确的属性,setter正确提升PropertyChanged,但众所周知,这还不足以使SL重新评估CanExecute命令.这就是为什么我也打电话给Delete.RaiseCanExecuteChanged()两个二传手.
所有这些工作正常(按钮被禁用并正确启用)到某一点,所有停止.在这一点上,呼叫Delete.RaiseCanExecuteChanged()不再触发我的断点CanDelete(),按钮永远保持原样.
我花了2个小时试图找出确切原因而没有效果.我怀疑RaiseCanExecuteChanged()在单个"绑定迭代"期间多次调用会以某种方式破坏机制.
任何提示?我已经在考虑使用额外的IsExecutable字段刷新INotifyPropertyChanged...
UPDATE
RelayCommand实际上是GalaSoft.MvvmLight.Command.RelayCommand来自MVVM Light Toolkit.ILSpy展示了一个非常简单的ICommand实现:
public bool CanExecute(object parameter)
{
    return this._canExecute == null || this._canExecute.Invoke();
}
public void RaiseCanExecuteChanged()
{
    EventHandler canExecuteChanged = this.CanExecuteChanged;
    if (canExecuteChanged != null)
    {
         canExecuteChanged.Invoke(this, EventArgs.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)
有_canExecute …
类似于约翰K的问题,但更具体和接受的答案不符合我的需要.
编译好:
Expression<Func<object, object>> specificExpression = (object o) => new object();
Expression generalExpression = specificExpression;
Run Code Online (Sandbox Code Playgroud)
而这个不是:
Expression generalExpression = (object o) => new object();
Run Code Online (Sandbox Code Playgroud)
报告编译错误:
Cannot convert lambda expression to type 'System.Linq.Expressions.Expression' because it is not a delegate type
Expression<Func<T1,T2>>来源于Expression.
现在我有一个框架,方法接受各种表达式,即类型Expression.被迫Expression<Func<T1,T2>>在每个方法调用中显式地将lambdas强制转换为相应的是令人沮丧的.
在这种情况下,为什么这个基本的OOP行为被打破了?
c# ×7
.net ×1
ado.net ×1
api-design ×1
autofac ×1
castle ×1
http ×1
http-patch ×1
json ×1
lambda ×1
multilingual ×1
mvvm ×1
mvvm-light ×1
relaycommand ×1
rest ×1
silverlight ×1
sql-server ×1