小编Tim*_*Tim的帖子

.NET Framework的目标版本与启动条件不匹配

我有一个我在VS 2010中构建的项目.它通过COM引用了一个C++项目,这也是解决方案的一部分.上周五,我做了一个成功的构建,更改了一行代码,进行了另一个构建,我开始收到有关.NET的错误.

项目中.NET Framework的目标版本与.NET Framework启动条件版本".NET Framework 3.5"不匹配.更新.NET Framework启动条件的版本以匹配高级编译选项对话框(VB)或应用程序页面(C#,F#)中的.NET Framework的目标版本.

  • 项目 - >属性 - >应用程序 - >目标框架(适用于Debug和Release中的每个项目)
  • 项目 - >属性 - >发布 - >先决条件(已确认.NET 3.5和Windows Installer 3.1)
  • 设置 - >启动条件 - > .NET Framework
  • 设置 - >属性 - >先决条件

我还查看了安装程序的vdproj代码,确认启动条件是.NET 3.5:

"ComponentsUrl" = "8:"
"Items"
{
    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"
    {
        "Name" = "8:.NET Framework 3.5 SP1"
        "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1"
    }
    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"
    {
        "Name" = "8:Windows Installer 3.1"
        "ProductCode" = "8:Microsoft.Windows.Installer.3.1"
    }
}

"ComponentsUrl" = "8:"
"Items"
{
     "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"
     {
         "Name" = "8:.NET Framework …
Run Code Online (Sandbox Code Playgroud)

.net c# windows-installer visual-studio-2010

31
推荐指数
2
解决办法
3万
查看次数

在XDocument中递归查找节点

我想我忽略了一些简单的东西,但是我很难递归地从XDocument中提取节点.

我有类似于这样的XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<content>
  <operation></operation>
  <entry>
    <observation>
      <templateId/>
      <code></code>
      <value></value>
      <entryRelationship>
        <observation>
          <templateId/>
          <code></code>
          <value></value>
        </observation>
      </entryRelationship>
      <entryRelationship>
        <observation>
          <templateId/>
          <code></code>
          <value></value>
        </observation>
      </entryRelationship>
    </observation>
  </entry>
</content>
Run Code Online (Sandbox Code Playgroud)

我以为我可以使用所有三个观察节点

foreach (XElement element in Content.Descendants("observation"))
    ExamineObservation(element);
Run Code Online (Sandbox Code Playgroud)

虽然看起来这只适用于观察没有孩子的情况.我也试过.Ancestors和.DecentantNodes,但没有得到我想要的.

我可以很容易地编写一个递归方法来获取我需要的东西,但是如果有的话,我宁愿使用现有的方法,特别是因为我将在几个项目中使用XML.我错过了一些明显的东西吗

请注意,任何说观察的节点,我都需要从中获取代码和值,因此在下面的示例中我将需要处理三个观察节点.观察节点的嵌套和数量是任意的.

谢谢你的帮助.

附录

在我看来,我可能没有提供有关XML的足够信息.我不认为标签会有所作为,但我想我应该包括它们以防万一.下面是我试图解析的实际消息的前几行.为了隐私,我确实用"..."替换了一些文本.

<?xml version="1.0" encoding="iso-8859-1"?>
<content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <operation>update</operation>
  <entry xmlns="urn:hl7-org:v3">
    <observation classCode="OBS" moodCode="EVN">
      <templateId root="..." />
      <code code="..." codeSystem="..." codeSystemName="..." displayName="...">
      </code>
      <value xsi:type="..." code="..." codeSystem="..." codeSystemName="..." displayName="...">
      </value>
      <entryRelationship typeCode="...">
        <observation classCode="..." moodCode="...">
Run Code Online (Sandbox Code Playgroud)

c# xml linq-to-xml

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

没有出现快捷方式图标

我试图获得一个在VS Installer应用程序中显示的快捷方式图标,但我没有运气.我不太确定我做错了什么.

我有一个启动服务的托盘应用程序.当我在调试中运行时,托盘具有正确的图标.我已将Tray的exe图标设置为正确的图标.

在安装程序中,我添加了桌面和用户程序菜单的快捷方式.对于这两个快捷方式,我尝试将图标设置为实际图标(由于这个原因我添加到应用程序文件夹中)和exe输出,但都不起作用.

安装后,"托盘"应用程序仍显示正确的图标,但是当我打开"设置"时,它会在UI窗口中显示正确的图标,但在"开始"栏上显示通用图标.(在调试模式下,"开始栏"显示正确的图标).快捷方式还显示通用图标.

我正在使用带有单个256 x 256图像的ico文件.任何人都有任何想法我可能做错了什么?

在此输入图像描述

我注意到的一件事是当前图标窗口中的图像看起来像素化(见上图).这是否意味着我没有使用有效大小的图标(256 x 256)?

c# installer icons visual-studio-2010

6
推荐指数
1
解决办法
1582
查看次数

使用反射获取字典值

我试图访问存储在String,UnknownClass类型的字典中的对象.我有密钥,并且知道值是几个容器类之一.由于值传递给接受对象的方法,因此我不需要知道存储为值的类的类型.我还需要调用ContainsKey来确认密钥是否存在.

我尝试了以下方法但没有成功:

Dictionary<String, object> list = (Dictionary<String, object>)source.GetType().GetProperty(dictionaryName).GetValue(source, null);
nextSource = list[key];
Run Code Online (Sandbox Code Playgroud)

这给了我一个投射错误,并且:

nextSource = source.GetType().GetMethod("get_Item").Invoke(source, new object[] { key });
Run Code Online (Sandbox Code Playgroud)

这给了我一个空的引用异常.

这里有一些代码,虽然我不太确定它会有多大帮助.

private void SetValue(object source, String path, String value)
{
    if (path.Contains('.'))
    {
        //  If this is not the ending Property, continue recursing
        int index = path.IndexOf('.');
        String property = path.Substring(0, index);

        object nextSource;
        if(property.Contains("*"))
        {
            path = path.Substring(index + 1);
            index = path.IndexOf('.');
            String dictionaryName = path.Substring(0, index);

            Dictionary<String, object> list = (Dictionary<String, object>)source.GetType().GetProperty(dictionaryName).GetValue(source, null);
            nextSource = …
Run Code Online (Sandbox Code Playgroud)

c# reflection dictionary

6
推荐指数
1
解决办法
1万
查看次数

MSTest v2 有序测试

我正在使用 Visual Studio 2017 Enterprise 和 MSTest V2。我的解决方案有多个单元测试项目。在一个项目中,我有单元测试来测试从安装目录加载资源。大多数测试资源是否正确加载,但有些删除资源以确认这也被正确处理。

在此处输入图片说明

我遇到的问题是测试并行运行。因此,删除资源的测试在加载资源的测试正在运行的同时执行此操作,并且我得到了失败的测试。

我意识到我可以通过更新我的代码以将目录发送到搜索来解决这个问题,或者通过运行一组测试然后再运行下一组来解决这个问题,但我更希望能够一次运行所有测试。听起来 MSTest v2 应该按顺序运行,除非另有指示并行运行,但在我的系统上,这显然是错误的。似乎 Ordered Test 也不适用于 v2。有没有办法让 MSTest V2 依次运行?

c# unit-testing mstest visual-studio-2017

6
推荐指数
1
解决办法
1386
查看次数

在作为服务运行时不会触发事件

我有一个在测试模式下运行时运行正常的事件,但是当我将代码作为服务运行时不会触发.在我发布代码之前,让我为应用程序提供一些结构,因为我觉得这就是问题所在.

我有一个托盘应用程序,用于控制路由器服务.启动时,服务会加载一个dll库,进行所有处理.启动库时,它会扫描目录中的插件,并将它们挂钩到主程序中.

当构建为Release时,服务被激活,我必须安装该应用程序.作为旁注,托盘应用程序以管理员身份运行,因此可以控制服务.构建为Debug时,托盘会直接启动库dll,跳过启动它的小型服务应用程序.见下图:

在此输入图像描述

在任何一种情况下,此插件的流程都是Receiver接收文件,并通知发件人通过事件转发它.该文件被发送以进行远程处理,然后返回到另一个Receiver,后者通过Event将结果转发给插件.然后插件处理该文件,并应在事件中发送回主程序.在Debug(无服务)中运行时,这正是发生的事情.作为服务运行时,除了通知主程序处理结果的插件外,所有事件处理都能正常工作.没有抛出异常,我已通过记录确认事件已正确连接.

连接活动:

//  Connect delegate to plugins that will add data to the database through the Router
if (plugin is INotify)
{
    ((INotify)plugin).NotifyProcessingComplete += new ProcessNotification(this.OnProcessed);
    LogWriter.Log("Associated " + plugin.Name + " with OnProcessed", LogFile);
}
Run Code Online (Sandbox Code Playgroud)

从插件中调用事件:

if (NotifyProcessingComplete != null)
    NotifyProcessingComplete(ExtractResults(args.ReceivedFile));
else
    LogWriter.Log("NotifyProcessingComplete Delegate was null.", LogFile);
Run Code Online (Sandbox Code Playgroud)

事件处理程序:

public void OnProcessed(ProcessArgs args)
{
    LogWriter.Log("On Dicom Process was called...", LogFile);
    lock (threadLock)
    {
        if (Settings != null)
        { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据日志,插件正确连接到OnProcessed,并且登录ExtractResults()方法显示它正确返回.但是,NotifyProcessingComplete不会调用OnProcessed方法.

再一次,只有在将代码作为服务运行时才会发生这种情况.我怀疑它可能与以管理员身份运行的托盘,以本地系统运行的服务以及动态加载的插件有关.

下面我已经包含了我加载插件的代码,以防它可能会有所帮助:

private void …
Run Code Online (Sandbox Code Playgroud)

c# service events delegates

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

无法找到名为的入口点

我正在用 c# 编写一个应用程序,该应用程序使用用 cpp 编码的第三方 dll。我对 dll 进行了多次调用,除了一个之外,它们都在工作。

我的代码通过以下方式进行调用:

return ObjectGetStringEntryID(pObject, strEntryID, strEntryID.Capacity);

[DllImport(EXTERNAL_DLL, CharSet = DefaultCharSet)]
protected static extern bool ObjectGetStringEntryID(IntPtr pObject, StringBuilder strEntryID, int nMaxLength);
Run Code Online (Sandbox Code Playgroud)

由于我可以访问源代码,我知道它包含以下定义:

BOOL ObjectGetStringEntryID(CMAPIObject* pObject, LPTSTR szEntryID, int nMaxLength)
Run Code Online (Sandbox Code Playgroud)

如前所述,我使用相同的格式对该 dll 进行了几次其他调用,并且它们都是成功的。

因此,如果有帮助的话,我有以下设置:

public const CharSet DefaultCharSet = CharSet.Ansi;
Run Code Online (Sandbox Code Playgroud)

有人看到我在通话中可能做错了什么吗?同班的我打电话:

MessageGetSubject(pObject, strSubject, strSubject.Capacity);

[DllImport(EXTERNAL_DLL, CharSet = DefaultCharSet)]
protected static extern void MessageGetSubject(IntPtr pMessage, StringBuilder strSubject, int nMaxLength);
Run Code Online (Sandbox Code Playgroud)

与方法匹配:

void MessageGetSubject(CMAPIMessage* pMessage, LPTSTR szSubject, int nMaxLength)
Run Code Online (Sandbox Code Playgroud)

这来自 c# 和 cpp 中与不起作用的调用相同的类,但它工作得很好。它的调用方式似乎没有任何区别,因此它们都应该工作或不工作。

如果有人对我做错了什么有任何见解,我将非常感谢您的帮助。

c# c++ pinvoke

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

按名称呼叫财产

我有一个包含超过100个唯一命名属性的类和超过20个子类,有时在列表中.以下是我的意思的简化说明:

public class classA
    {
        public String PropertyA1 { get; set; }
        public int PropertyA2{get;set;}
        public List<classB> myList;
        public classC myClass { get; set; }

        public void SetProperty(String PropertyName)
        {
            // Match property name to property in this class or child class.
        }
    }

    class classB
    {
        public String PropertyB1 { get; set; }
        public bool PropertyB2 { get; set; }
    }

    class classC
    {
        public String PropertyC1 { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我想做两件可能会或可能不会成功的事情.我需要做的第一件事是遍历每个公共属性,包括列表中的子类和类的公共属性,并转换值.我知道我可以通过序列化到xml并解析结果来完成解析.我甚至有代码转换为xml,因为类的功能是构建一个xml对象.但是,我担心通过xml解析可能比通过反射访问属性要昂贵得多.可以以这种方式使用反射,并且它比修改xml更快吗?

我想做的另一件事是访问任何将属性名称传递给方法的属性.我意识到我需要一个单独的方法来访问列表中的类,并且可能必须将列表转换为字典.问题是,这是否可行,代码只需要在父类中,或者每个子类是否需要重复代码?

c# reflection

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

从VB转换为C#

我的任务是将解决方案从VB转换为C#.有22个项目和数百个课程,所以我决定研究转换器.我最终选择了SharpDevelop,这是一个带有转换器的IDE.我在每个项目上运行它,并且有很多错误需要修复,但是我应该能够通过它们并希望能够解决它们.我遇到的主要问题是摘要日志.我有数百行各类阅读:

-- line 0 col 0: Case labels with binary operators are unsupported : Equality
-- line 0 col 0: Case labels with binary operators are unsupported : Equality
-- line 0 col 0: Case labels with binary operators are unsupported : Equality
-- line 0 col 0: Case labels with binary operators are unsupported : Equality
-- line 0 col 0: Case labels with binary operators are unsupported : Equality
Run Code Online (Sandbox Code Playgroud)

我已经看了这个,但我没有找到一个很好的解释,它的真正含义或如何纠正它.我发现的大多数是注释代码行,如下所示:

// ERROR: Case labels with binary operators are …
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net sharpdevelop converter

5
推荐指数
2
解决办法
552
查看次数

在DevExpress CheckedComboBoxEdit中获取已检查的项目

我正在使用DevExpress 9.3 CheckedComboBoxEdit,我需要获取所有选中项目的集合.看起来这应该是一个简单的任务,但我找到的最接近解决方案的东西是我可以使用的东西:

CheckedComboBoxEdit.Properties.GetItems.GetCheckedValues()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这里没有GetCheckedValues方法.我发现了以下内容:

CheckedComboBoxEdit.Properties.GetCheckedItems()
Run Code Online (Sandbox Code Playgroud)

它返回一个对象,但我找不到任何关于我应该将对象强制转换为什么的引用.我也尝试遍历这些项目,并根据此处的建议检查每个项目是否已检查,但Items返回一个字符串集合,而不是CheckedListBoxItem,因此我无法测试它们是否被选中.

我想要的是一个已检查项目的String集合; 现在,我可以接收它们作为任何类型的集合,甚至自己创建集合.我知道必须有一些非常简单的东西,我忽略了,但我似乎无法找到它.

这是我提出的解决方案.我更喜欢更优雅的东西; 似乎应该有一种方法来获取已检查的项目,因为这是控件的用途.不过,这似乎有效:

Private Function GetChecked() As List(Of String)
    Dim checked As New List(Of String)
    Dim checkedString As String = CType(SitePickerControl.Properties.GetCheckedItems(), String)
    If (checkedString.Length > 0) Then
        checked.AddRange(checkedString.Split(New Char() {","c}))
    End If
    Return checked
End Function
Run Code Online (Sandbox Code Playgroud)

如果有人能给我一个合适的解决方案,我很乐意看到它.

vb.net devexpress

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