在C#中是否有一种使用反射来确定方法是否已作为扩展方法添加到类的技术?
给定一个扩展方法,如下所示,可以确定Reverse()已被添加到字符串类?
public static class StringExtensions
{
public static string Reverse(this string value)
{
char[] cArray = value.ToCharArray();
Array.Reverse(cArray);
return new string(cArray);
}
}
Run Code Online (Sandbox Code Playgroud)
我们正在寻找一种机制,在单元测试中确定扩展方法是由开发人员适当添加的.尝试这种情况的一个原因是,开发人员可能会在实际的类中添加类似的方法,如果是,编译器将选择该方法.
我们正在替换使用VS2005构建的旧(5年以上)Windows服务应用程序,该应用程序进行HTTP GET调用.有几件事情使这很困难(例如网络服务器在客户的网络上,我们无法直接连接到它),不幸的是,我们不想取消正在运行的系统来用WinForm取代它Fiddler可以监控的版本.新代码似乎正在正确地执行所有操作,但是,唉,它无法进行身份验证.
有没有办法配置Fiddler(2.2.9.1)来拦截来自Windows服务的HTTP调用?
我们有一个部署到远程客户系统的C#服务.应用程序将大量"诊断"信息写入控制台(即Console.WriteLine()).该服务不是"做它应该做的事".我们如何在另一个应用程序中捕获服务的控制台输出?
WinForm版本可以在客户位置加载应用程序.不幸的是,它正常运作.
更新:
我们可以更改服务的更改,但此时不希望进行重大更改.
我们也登录MSMQ,但仅限于"重要"事件.此服务确实与MSMQ交互以进行正常操作.或者,至少,它应该.当WinForm版本的时候,该服务似乎没有从MSMQ中提取项目.因此,编写发送到控制台的消息可能会有问题.
我今晚和我的非技术人员说话.她在谈论她是如何培训员工使用一些新软件的.该软件大量使用向导来完成任务.她对我的问题是"为什么巫师被称为'巫师?' 他们是由一些对"龙与地下城"感兴趣的书呆子制作的吗?"
我意识到,虽然"书呆子"和"龙与地下城"在我的情况下都是正确的,但我不知道术语"向导"的起源,因为它涉及引导用户通过某些应用程序的应用程序的一部分困难的过程.
我很想知道其他人在这个伟大而重要的问题上有什么想法.
鉴于此C API声明如何将其导入C#?
int _stdcall z4ctyget(CITY_REC *, void *);
Run Code Online (Sandbox Code Playgroud)
我已经能够做到这一点:
[DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
Run Code Online (Sandbox Code Playgroud)
当然在C#中,"void*"无法编译.
一些谷歌搜索表明它应该被翻译为"对象".这似乎应该工作.但其他人表示"Void*在C/C++术语中被称为函数指针,在C#术语中是一个委托".在这里,这并不是很有意义,因为它会委托给谁?通过谷歌搜索找到的其他API的类似调用使用相应API中的其他函数.但是在这个API中没有其他调用是有意义的.
该调用的文档显示了一个示例:
z4ctyget(&city, “00000”);
Run Code Online (Sandbox Code Playgroud)
这似乎表明甚至可以传递静态值.
它将使用object代替void*进行编译.我不知道这是否正确,我没有机会对其进行测试(许可问题).
鉴于此C API声明如何将其导入C#?
const char* _stdcall z4LLkGetKeySTD(void);
Run Code Online (Sandbox Code Playgroud)
我已经能够做到这一点:
[DllImport("zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4LLkGetKeySTD",
ExactSpelling = false)]
private extern static const char* z4LLkGetKeySTD();
Run Code Online (Sandbox Code Playgroud) 你可以想象,谷歌搜索或Binging任何包含'@'的短语很难.
在创建新的Web服务时,导入的C#代理类的一个成员以@为前缀.例如:
plan.@event = new Insurance.Event();
Run Code Online (Sandbox Code Playgroud)
我假设它是Visual Studio解决与保留字的潜在冲突的方式,因为'event'是一个保留字.将Web服务接口中的属性更改为"event"之外的其他内容(即"healthevent")会从属性中删除@.这是正确的假设吗?
Visual Studio 2008解决方案中的最佳项目数是多少?
我们有一个Visual Studio 2008解决方案,目前约有50个项目.它可能会继续增长,因为解决方案中的大部分项目都包含主应用程序的插件程序集.
如果在一个解决方案中看起来"太多项目",那么您将如何确定哪些项目应该在解决方案中组合在一起?鉴于我们在一个解决方案中大约有50个项目的示例,其中大部分项目是插件,插件数量可能增长,应该如何构建解决方案?是应该将所有插件放在自己的解决方案中?当插件解决方案中的插件数量达到"太多"的幻数时,组织应该如何改变?
我们对解决方案中的这么多项目没有任何问题......它加载速度快,构建速度快,使用合理的内存量,并且不会导致VS2008崩溃或碰到任何VS2008错误.
我查找了微软的文档(似乎没有任何内容),谷歌搜索"每个项目都有自己的解决方案"的建议,"将所有项目放在一个解决方案中".两种极端似乎都是荒谬的.我正在中间寻找一些合理的指导.
Stackoverflow上还有其他与您看到的最大值相关的问题.这与最佳状态并不完全相同.
MSMQ维护一种称为"传出队列"的队列.MSMQ服务使用这些队列来保存发往消息时无法联系的服务器的消息.这些是特殊的临时队列,与普通的公共队列和专用队列分开.
我最近遇到过一种情况,其中一些发往本地系统的消息(即生成该消息的同一台计算机)最终出现在"传出队列"之一中.使用管理控制台钻取到传出队列时,可以看到目标具有本地系统和队列的正确路径信息.在此特定方案中,这些"传出队列"中保存的消息永远不会传递到正确的队列.留在那里,实际上已经失去了.
一些发往本地系统队列的消息,包括"传出队列"中列出的相同队列的消息,都可以正常传送.当消息最终出现在"传出队列"中似乎是随机的.那就是:有些人会工作正常,有些则不会.
似乎受此影响的队列都是非交易性的.事务性队列似乎总是接收消息.至少,发送消息的应用程序没有捕获事务队列的异常.
什么会导致MSMQ将发往本地系统队列的消息放入"传出队列"?是MSMQ服务无法联系自己发送消息吗?系统非常繁忙(CPU使用率为80%).这样做时,MSMQ可能会缺乏资源吗?
c# ×6
dllimport ×2
console ×1
fiddler ×1
history ×1
msmq ×1
pinvoke ×1
reflection ×1
service ×1
terminology ×1
web-services ×1