我最近一直在搜索和阅读SignalR,虽然我看到很多关于Hubs和Persistent Connections之间差异的解释,但是我还没能把我的脑袋放到下一个级别,这就是为什么我会选择一种方法而不是另一种?
我正在构建一个GIS应用程序,但每当我运行代码时,它都会给我这个错误
System.Runtime.InteropServices.COMException未处理检索具有CLSID {FBF5715D-A05D-11D4-A64C-0008C711C8C1}的组件的COM类工厂由于以下错误而失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG)) .
此外,在项目属性中,禁用COM Interop注册选项.
我昨天在Visual Studio 2015中打开了我们的解决方案,我们的一些单元测试(在Visual Studio 2013中运行正常)开始失败.Digger更深入我发现这是因为召集GetTypes()一个程序集返回了不同的结果.我已经能够创建一个非常简单的测试用例来说明它.
在Visual Studio 2013和2015中,我使用.NET Framework 4.5.2创建了一个新的控制台应用程序.我在以下两个项目中都添加了以下代码.
class Program
{
static void Main(string[] args)
{
var types = typeof(Program).Assembly.GetTypes()
.Where(t => !t.IsAbstract && t.IsClass);
foreach (var type in types)
{
Console.WriteLine(type.FullName);
}
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
当我在Visual Studio 2013中运行时,我得到以下输出(如预期的那样).
VS2013Example.Program
当我在Visual Studio 2015中运行时,我得到以下输出(不是预期的).
VS2015Example.Program
VS2015Example.Program + <>Ç
那是什么VS2015Example.Program+<>c类型的?原来它是.Where()方法中的lambda .是的,这是正确的,不知何故,本地lambda作为一种类型暴露.如果我.Where()在VS2015中注释掉,那么我就不再获得第二行了.
我已经使用Beyond Compare来比较两个.csproj文件,但唯一的区别是VS版本号,项目GUID,默认命名空间和程序集的名称,VS2015有一个对System.Net.Http的引用, VS2013一个没有.
有没有人见过这个?
有没有人解释为什么局部变量将在程序集级别作为类型公开?
c# compiler-construction roslyn visual-studio-2013 visual-studio-2015
我在ac#项目中遇到异常:
System.Runtime.InteropServices.COMException(0x80040154):由于以下错误,检索具有CLSID {877AA945-1CB2-411C-ACD7-C70B1F9E2E32}的组件的COM类工厂失败:80040154.
这意味着什么?
在我的一个控制器+动作对中,我从另一个地方获取另一个控制器和动作的值作为字符串,我想重定向我当前的动作.在进行重定向之前,我想确保我的应用程序中存在控制器+操作,如果没有,则重定向到404.我正在寻找一种方法来执行此操作.
public ActionResult MyTestAction()
{
string controller = getFromSomewhere();
string action = getFromSomewhereToo();
/*
At this point use reflection and make sure action and controller exists
else redirect to error 404
*/
return RedirectToRoute(new { action = action, controller = controller });
}
Run Code Online (Sandbox Code Playgroud)
我所做的就是这个,但它不起作用.
var cont = Assembly.GetExecutingAssembly().GetType(controller);
if (cont != null && cont.GetMethod(action) != null)
{
// controller and action pair is valid
}
else
{
// controller and action pair is invalid
}
Run Code Online (Sandbox Code Playgroud) 我有两个商业合同类:
public BusinessContract
public Person : BusinessContract
Run Code Online (Sandbox Code Playgroud)
在另一个类中,我有以下代码:
private Action<BusinessContract> _foo;
public void Foo<T>( Action<T> bar ) where T : BusinessContract
{
_foo = bar;
}
Run Code Online (Sandbox Code Playgroud)
以上甚至都不会编译,这让我感到困惑.我将T限制为BusinessContract,为什么编译器不知道bar可以分配给_foo?
为了解决这个问题,我们尝试将其更改为以下内容:
public void Foo<T>( Action<T> bar ) where T : BusinessContract
{
_foo = (Action<BusinessContract>)bar;
}
Run Code Online (Sandbox Code Playgroud)
现在编译器很高兴,所以我在我的应用程序的其他地方编写以下代码:
Foo<Person>( p => p.Name = "Joe" );
Run Code Online (Sandbox Code Playgroud)
应用程序在运行时以InvalidCastException爆炸.
我不明白.我不应该能够将更具体的类型转换为不太具体的类型并分配它吗?
UPDATE
Jon回答了这个问题,所以得到了点头,但只是为了关闭循环,这就是我们最终解决问题的方法.
private Action<BusinessContract> _foo;
public void Foo<T>( Action<T> bar ) where T : BusinessContract
{
_foo = contract => bar( (T)contract );
}
Run Code Online (Sandbox Code Playgroud)
我们为什么这样做?我们有一个假DAL,我们用于单元测试.使用其中一种方法,我们需要让测试开发人员能够指定在测试期间调用方法时应该执行的操作(这是一种从数据库更新缓存对象的刷新方法).Foo的目的是设置调用刷新时应该发生的事情.IOW,在本课程的其他地方,我们有以下内容.
public void …Run Code Online (Sandbox Code Playgroud) 当我尝试添加具有多对多关系的项时,我收到主键冲突错误:
我有两个类 - 文章和标签有多对多的关系:
public class Article
{
public int ID { get; set; }
public string Text { get; set; }
public ICollection<Tag> Tags { get; set; }
}
public class Tag
{
[Key]
public string UrlSlug { get; set; }
public string Name { get; set; }
public ICollection<Article> Articles{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我添加新文章时,我允许用户输入任何标签,然后我想创建一个新标签,如果尚未在数据库中创建标签,或者如果标签已经将标签添加到文章对象的标签集合中存在.
因此,当我创建新的Article对象时,我调用以下函数:
public static Tag GetOrLoadTag(String tagStr)
{
string tagUrl = Tag.CreateTagUrl(tagStr);
var db = new SnippetContext();
var tagFromDb = from tagdummy in db.Tags.Include(x …Run Code Online (Sandbox Code Playgroud) 这是一个System.Windows.Forms.TreeView,而不是WPF或Web TreeView.
我必须遗漏一些东西,因为我无法相信这是那么困难.
我的表单上有一个TreeView.加载所有数据以填充TreeView非常慢,因此我只想加载顶级节点,然后在用户展开节点时填充子节点.问题是,如果节点没有任何子节点,它不会在节点旁边显示+号,这意味着它无法展开,这意味着我无法捕获扩展事件来加载子节点.
多年前,当我使用PowerBuilder时,你会将一个HasChildren(或类似)属性设置为true,基本上"谎言"到控件并强制它显示+,然后你可以捕获Expanding事件.当没有子节点时,我无法弄清楚如何强制+出现在节点上.
我尝试过一种方法,我在每个节点上添加一个虚拟节点,然后在扩展检查虚拟节点是否存在并删除它然后加载子节点,但由于各种原因不值得进入这里解决方案不是在我的情况下可行.
我用Google搜索了c#,treeview,延迟,延迟,加载,强制,扩展以及其他一些现在没有运气的条款.
PS我在SourceForge上找到了TreeViewAdv项目,但如果可以避免,我宁愿不在我们的环境中引入新组件.
我们有一个包含许多项目的解决方案(可能是20个或更多).最近我们做了一些更改,需要从COM调用几个这些程序集,这意味着我们需要对它们进行强名称.这些程序集引用了我们项目中的其他程序集,这意味着它们也需要具有强名称.它们还具有InternalsVisibleTo属性,因此授予的程序集也必须具有强名称.
我建议我们简单地将它们全部命名,而不是试图找到哪些组件需要签名/强命名.这让几个人对风险感到不安.我认为没有风险,但他们想要签署集会的利弊.我能想到的唯一的事情是:
优点
缺点
我有两个具体问题:
我们从应用程序中运行迁移,以便即时创建数据库.我们还在单元/集成测试中使用迁移来为要使用的测试创建数据库.几个月前,我们注意到我们测试的运行时间大大增加,我们已经能够将其缩小到DbMigrator类的实例化.即使有一个非常简单的Configuration类,它仍然需要大约10秒钟来创建DbMigrator.
例如,这是从"弹性数据库工具 - 实体框架"示例应用程序中获取的配置类.
internal sealed class Configuration : DbMigrationsConfiguration<ElasticScaleContext<int>>
{
public Configuration()
{
this.AutomaticMigrationsEnabled = false;
this.ContextKey = "CodeFirstNewDatabaseSample.BloggingContext";
}
}
Run Code Online (Sandbox Code Playgroud)
以下是用于创建和运行迁移的代码.
var configurator = new Configuration();
configurator.TargetDatabase = new DbConnectionInfo(connStrBldr.ConnectionString, "System.Data.SqlClient");
var migrator = new DbMigrator(configurator);
migrator.Update();
Run Code Online (Sandbox Code Playgroud)
这是来自VS2015的跟踪信息.
ConfigurationTargetDatabase属性了DbMigrator我们正在使用Entity Framework 6.1.3.还有其他人经历过这个吗?
c# ×7
.net ×4
exception ×2
asp.net-mvc ×1
com ×1
delegates ×1
primary-key ×1
reflection ×1
roslyn ×1
signalr ×1
treeview ×1
windows ×1