我一直认为它在两方面都很好.然后做了这个测试并意识到它不允许重新分配:
int[] a = {0, 2, 4, 6, 8};
Run Code Online (Sandbox Code Playgroud)
工作正常但不是:
int [ ] a;
a = { 0, 2, 4, 6, 8 };
Run Code Online (Sandbox Code Playgroud)
这有什么技术原因吗?我想我会在这里问一下,因为这种行为是我直觉所期望的.
.net c# compiler-construction collections collection-initializer
精简版
我有一个使用插件基础设施的应用程序.这些插件具有可配置的属性,可帮助他们了解如何完成工作.插件被分组到配置文件中以定义如何完成任务,配置文件存储在由DataContractSerializer序列化的XML文件中.问题是在读取配置文件时,应用程序反序列化必须知道配置文件中定义的所有插件.我正在寻找一种方法来处理未知插件的解决方案.请参阅下面提出的解决方案部分,了解我实施的一些想法,但我对任何事情都持开放态度(尽管我不必重新发明应用程序).
详情
背景
我已经为我目前在C#4工作的公司开发了一种内部使用的业务流程自动化系统.它详尽地使用"插件"来定义所有内容(从要执行的任务到工作单元的定义)并且在很大程度上依赖于动态配置模型,而动态配置模型又依赖于C#4/DLR动态对象来完成工作.由于其动态特性,它在执行时有点沉重,但它能够始终如一地运行,并且能够满足我们的需求.
它包括一个WinForms配置UI,它广泛使用Reflection来确定插件的可配置属性/字段,以及定义要处理的每个工作单元的属性/字段.用户界面也建立在BPA引擎的基础之上,因此它彻底了解了(松散的)对象模型,它允许引擎完成其工作,巧合的是,这导致了一些用户体验的改进,例如,ad-hoc作业执行和用户输入的配置时验证.同样还有改进的余地,但它似乎做了它的工作.
配置UI使用DataContractSerializer来序列化/反序列化指定的设置,因此必须在配置加载之前(或在配置加载时)加载配置引用的任何插件.
结构体
BPA引擎实现为共享程序集(DLL),由BPA服务(Windows服务),配置UI(WinForms应用程序)和插件测试程序(Windows服务的控制台应用程序版本)引用.引用共享程序集的三个应用程序中的每一个仅包含执行其特定目的所需的最少代码量.此外,所有插件必须引用一个非常薄的程序集,它基本上只定义了插件必须实现的接口.
问题
由于应用程序中使用的可扩展性模型,始终要求配置UI从与服务应用程序相同的目录(在同一台PC上)运行.这样,UI总是知道服务知道的所有程序集,因此可以反序列化它们而不会遇到缺少的程序集.现在我们已经接近推出系统,为了安全起见,我们的网络管理员出现了在我们网络中的任何PC上远程允许配置UI的要求.通常,如果总是有一组已知的程序集要部署,这不会成为问题,但是,如果能够使用用户构建的程序集扩展应用程序,则必须有一种方法来解析插件所从的程序集可以实例化/使用.
建议(可能很明显)的解决方案
将WCF服务添加到服务应用程序,以允许典型的CRUD操作针对该服务实例所知道的配置,并重新配置配置UI,使其更像SSMS,具有Connect/Disconnect模型.这并没有真正解决问题所以我们还需要从Service应用程序中公开某种ServiceContract,以允许查询它知道/有权访问的程序集.这很好而且相当直接,但问题出现了,"用户应该何时了解服务所知道的程序集?" 在连接时,我们可以将所有程序集从服务发送到UI,以确保它始终知道服务所做的所有程序集,但是会因AppDomain管理(可能不必要)和程序集版本冲突而变得混乱.因此,我建议挂钩AppDomain.AssemblyResolve/AppDomain.TypeResolve事件,以便仅下载客户端尚未了解的程序集,并且仅在需要时下载.这不一定能清除AppDomain管理问题,但它肯定有助于解决版本冲突和相关问题.
题
如果你坚持我这么久我鼓掌并感谢你,但现在我终于得到了实际的问题.经过几个月的研究并最终得出结论,我想知道这里是否有人必须处理类似的问题,以及你如何处理陷阱和缺点?是否有一种标准的处理方法,我完全错过了,或者你有什么建议基于你过去如何成功处理?您是否看到提出的方法有任何问题,或者您可以提供替代方案吗?
我知道不是每个人都在我的脑海中,所以如果你需要进一步澄清/解释,请告诉我.谢谢!
更新
我给了MEF一个公平的摇晃,觉得它对我的目的来说太简单了.并不是因为它不能弯曲来处理我的应用程序的插件要求,问题是这样做太麻烦和脏,使其可行.这是一个很好的建议,它有很大的潜力,但在目前的状态,它还没有.
关于我提出的解决方案的其他想法或反馈?
更新
我不知道我遇到的问题是否过于局部化,如果我没有正确描述我想要实现的目标,或者这个问题是否太过于无理由地被完整阅读; 但是我收到的几个答案都非常有帮助,足以帮助我以不同的方式思考问题并找出我所追求的一些缺点.
简而言之,我正在尝试做的是使用三个应用程序,这些应用程序在当前状态下使用公共目录结构共享信息(配置/程序集),并尝试使这些应用程序在网络上工作,对可用性和体系结构的影响最小.
文件共享似乎是这个问题的明显答案(正如@SimonMourier在评论中提出的那样),但是当出现问题时,使用它们会转化为缺乏控制和可调试性.我认为它们是一种可行的短期解决方案,但从长远来看它们似乎并不可行.
要了解C++是否是我的项目的正确语言,我想测试UTF-8功能.根据参考资料,我建立了这个例子:
#include <string>
#include <iostream>
using namespace std;
int main() {
wstring str;
while(getline(wcin, str)) {
wcout << str << endl;
if(str.empty()) break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入一个UTF-8字符时,它行为不端:
$ > ./utf8
Hello
Hello
für
f
$ >
Run Code Online (Sandbox Code Playgroud)
它不仅不会打印ü
,而且会立即退出.gdb
告诉我没有崩溃,但正常退出,但我发现很难相信.
今天我一直在互联网上弹跳,在阅读了很多解决方案之后,我决定写一个Chromium包装器将是一个有趣的学习经历; 更不用说我目前正在开展的几个项目是值得的.
我知道已经有一些包装在那里(awesomium,锫),更不要说一些基本的教程,像这样的,但是我看写我自己的包装.
我这样做的主要兴趣是,我能够创建和访问由WebKit生成的DOM结构,以便在C#中使用,在html依赖的任何javascript之前和之后都运行.我知道我可以使用HTMLAgilityPack和Majestic12进行HTML解析,但我希望在经过试验和测试的引擎之上构建一些快速,高效且将在可预见的未来积极开发的引擎.WebKit是一个积极开发的布局引擎,嵌入在一些最流行的浏览器中,而V8是一个令人印象深刻的javascript引擎,因此决定使用Chromium.
看到我不关心实际渲染任何内容,而是我希望访问网页的结构,我觉得整体嵌入WebKit可能有点过分.即使在我希望javascript改变DOM的情况下,我仍然没有使用渲染结果.
总结:
我真正想要的Chromium是能够创建网页的DOM,以及(可选)使用Chromium令人印象深刻的V8引擎运行所述页面脚本以进一步操纵DOM的能力.我知道这将是一项艰巨的任务,但我很想知道你要说些什么. 简而言之,是否有人与WebKit和V8(可能通过Chromium)合作,谁可以评估这种可行性并借给我他们的专业知识(通过如何处理这个问题的建议)? 我知道我最终可以确定一种合适的方式来解决这个问题,但我希望能够加快这一过程.链接或者可能是一个相对简短而又甜蜜的高级别"我就是这样做的"是我正在寻找的(也就是说我不需要任何太过花哨的东西).
我希望我所要求的不是太过分散.如果你发现它太笼统并且想要关闭这个主题,请不要这样做,请留下评论,我会尽量缩小焦点.正如我刚刚说过的那样,自从我感冒以来,我的思绪在今天蹦蹦跳跳.
每当我调试一段涉及数组或int,double,string等列表的代码时,我更喜欢有时打印它们.我为此做的是为不同类型编写重载的printArray/printList方法.
例如
我可以使用这3种方法来打印各种类型的数组
public void printArray(int[] a);
public void printArray(float[] b);
public void printArray(String[] s);
Run Code Online (Sandbox Code Playgroud)
虽然这对我有用,但我仍然想知道是否可以使用通用方法打印任何类型的数组/列表.这也可以扩展到对象的数组/列表.
无法更新EntitySet'InstanceObjectName',因为它具有DefiningQuery并且元素中不存在任何元素以支持当前操作
我正在尝试以编程方式登录到Yahoo开发人员API.我遇到了一个绊脚石,我无法访问HttpWebResponse的所有"Set-Cookie"标题.
Fiddler在响应的标题中显示以下cookie:
Set-Cookie: B=733jjvp7f5g8f&b=4&d=1pFN8bVpYFYaPUme88.fc6ZzTSI-&s=kc&i=.1p3Ei3yvwqZjo0gcg7D; expires=Sun, 22-Dec-2013 05:33:04 GMT; path=/; domain=.yahoo.com
Set-Cookie: F=a=GYsABKAMvTZoTcNAPKUXrclX_Hb77EA7I_62nONz8QeEwNevHwqJ_NyizED88uhv9aMx.9o-&b=3tN5; expires=Sun, 22-Dec-2013 05:33:04 GMT; path=/; domain=.yahoo.com
Set-Cookie: Y=v=1&n=0v251rt3ifppb&l=0kii84if0h70ma/o&p=m2fvvau012000000&iz=1111&r=if&lg=en-AU&intl=au&np=1; path=/; domain=.yahoo.com
Set-Cookie: PH=fn=jW23i4lnq1UpiP.lsuU-&l=en-AU; expires=Sun, 22-Dec-2013 05:33:04 GMT; path=/; domain=.yahoo.com
Set-Cookie: T=z=QEs8OBQYTBPBEZq31nTCqv1MzNPBjUwTjcwMDZOTjY-&a=YAE&sk=DAAtoxgrYmWIMk&ks=EAA3Ha0H7qyCT8P3cI9NWJrIA--~E&d=c2wBTkRRNEFUSTNPVEEzTnpFNU9URS0BYQFZQUUBZwFCRFZQTkRSSjJQRVRDTEdFT0xCQ1hER0VVUQFvawFaVzAtAXRpcAF2MkNUVUEBenoBUUVzOE9CQTdF; path=/; domain=.yahoo.com
Set-Cookie: SSL=v=1&s=kTc532PQYAe1iT.23Q55E50ZdoOAdEK_fshc3g_YZ3SxszcbuHkmpJUAQ7RT67nDNA0nXyX68um90ZuS9RQztQ--&kv=0; path=/; domain=.yahoo.com; secure; httponly
Run Code Online (Sandbox Code Playgroud)
但是,我无法通过.NET访问"Set-Cookie"的第一个实例以外的任何内容:
// Make the web request:
var userAuthWebRequest = WebRequest.Create(uri) as HttpWebRequest;
var response = userAuthWebRequest.GetResponse() as HttpWebResponse;
// Dump the headers to debug:
Debug.WriteLine(string.Format("Set-Cookie: {0}", response.Headers.Get("Set-Cookie")));
Run Code Online (Sandbox Code Playgroud)
我的调试输出返回:
Set-Cookie: B=733jjvp7f5g8f&b=3&s=b1; expires=Sun, 22-Dec-2013 05:33:03 GMT; path=/; domain=.yahoo.com
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我向Headers.GetValues发出类似的请求,它实际上会返回"Set-Cookie"标题的两个实例,这些实例似乎已连接在一起:
foreach (var headerName …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用ASP.NET渲染HTML5的开源项目.在这里你可以看看:http: //asphtml5.codeplex.com/
现在我在更新面板时遇到问题,回复了"text"以外的类型的输入值.你可能知道,html 5引入了几种输入类型,例如'number','tel','search'等.现在,如果我渲染这样的控件,一切正常情况下工作正常,但如果我把它们放入UpdatePanel,没有值将被回发,值将被重置.
这是一小段产生相同错误的代码:
<asp:UpdatePanel runat="server" ID="UP">
<ContentTemplate>
<p>
Enter A Number:
<asp:TextBox runat="server" ID="Number2" type="number" />
</p>
<asp:Button Text="Submit" runat="server" ID="BtnSubmit" OnClick="BtnSubmit_Click" />
<p>
You entered :
<asp:Label Text="" ID="LblValue" runat="server" />
</p>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
如果您在支持html 5的浏览器上测试此代码,请以Chrome为例,将显示Numeric Up-Down字段.但是如果单击提交按钮,它将丢失您输入的值.
这是事件处理程序的代码:
protected void BtnSubmit_Click(object sender, EventArgs e)
{
LblValue.Text = Number2.Text;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的是读取UpdatePanel,ScriptManager和ScriptManagerProxy类代码,没有找到.
我想我可能需要创建自己的UpdatePanel和/或ScriptManager类来使用.
任何人都可以帮助我,并告诉我在哪里检查.
我正在开发一个项目,要求我在应用程序中播放歌曲时添加节拍检测(WinForms - C#).
我目前正在使用NAudio.NET播放歌曲并显示有关该歌曲的详细信息.
是否有一个库允许我这样做或以某种方式手动检测这个?我不期待一个完成的解决方案,但指向正确的方向.理想情况下,我希望这是一个实时检测,但它不是必需的.
我正在构建一个相当简单的应用程序,它执行一些单独的HTTPWebRequests,每个都在自己的计时器上.我不太可能需要一次运行3个以上的单独请求.
如果在另一个HTTPWebRequest正在进行时触发Timer Tick,那么Timer Tick触发的事件会发生什么?我应该添加线程吗?
c# ×8
.net ×3
asp.net ×1
automation ×1
c++ ×1
c++-cli ×1
chromium ×1
collections ×1
debugging ×1
entity ×1
generics ×1
html5 ×1
javascript ×1
linq-to-sql ×1
linux ×1
naudio ×1
stl ×1
timer ×1
updatepanel ×1
utf-8 ×1
wcf ×1
webkit ×1
winforms ×1
wstring ×1