我知道用c#编写的exe程序可以读取config文件中的配置信息,比如Test.exe,可以在与Test.exe相同目录下放置一个config文件:Test.exe.config,用System.Configuration.ConfigruationSettings可以读取其中的配置信息,但是我现在希望用c#编写一个dll,叫做Log。dll,其主要功能是将我的程序中的错误作为日志记录到一个log文件中,我希望log文件的路径和名称可以动态配置,也就是在一个config文件中配置,但是如何让我的dll读取文件中的配置呢,我试过在dll的同一目录中放置一个Log.dll.config,但是我的dll始终不能将文件中对应的内容读出来,请各位大侠指教,谢谢

--------------------解答-------------------------

一种强行指定dll assembly读取其相应*.dll.config配置文件的方法(又名:如何创建.net 的DCOM)

一般来说,.net 的exe assemly会存在一个对应的*.exe.config配置文件。当需要读取配置信息的时候,可以直接通过ConfigurationManager.AppSettings[index]来读取*.exe.config中的键值,但很少存在dll assembly需要config file的情况。假如当前dll assembly名为test.dll,如果在test.dll中调用ConfigurationManager来读取test.dll.config,那么是无法成功的!

当然,在dll assembly中要读取其*.dll.config这种需求非常少见。但是确要读取的话,可以采取以下方式,即强行制定其dll assembly的路径。

以下代码演示的是:编写一个.net dll并将其发布为一个regasm test.dll /codebase /tlb将其发布为一个DCOM, 然后通过asp页面来调用 。其中在test.dll中的公布的方法HelloWorld()需要读取其test.dll.config中的key value.

dll assembly代码如下:

C# version:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Configuration;
using System.IO;
using System.Reflection; namespace AnotherDCOM
{
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ITestClass
    {
        string HelloWorld();
    }     [ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class SimpleClass:ITestClass
    {    
      
        public string HelloWorld()
        {
            Assembly assembly;
            System.Configuration.Configuration configuration;
            ExeConfigurationFileMap map;
         
            Uri uri;
            map = new ExeConfigurationFileMap();
            assembly = Assembly.GetCallingAssembly();
            uri = new Uri(Path.GetDirectoryName(assembly.CodeBase));
            map.ExeConfigFilename = Path.Combine(uri.LocalPath, assembly.GetName().Name + ".dll.config");
            string str=ConfigurationManager.OpenMappedExeConfiguration(map, 0).AppSettings.Settings["MyString"].Value;
            /*
            说明:如果采取如下的传统方法,读取config key
            string str = ConfigurationManager.AppSettings["MyString"];
            如果采取这种方式的话, 则assembly不会读取相应*.dll.config文件;by default,只有exe assembly的配置文件才会被load
             */
            if (str != null)
            {
                return str;
            }
            else
            {
                return "Hello World .net Another DCOM, Can't read config";
            }
       
        }
    }
}

VB.net version

Imports System
Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.Configuration
Imports System.IO Namespace NetDcom
    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> Public Interface ITestClass
        Function HelloWorld() As String
    End Interface     <ClassInterface(ClassInterfaceType.AutoDispatch), ProgId("NetDcom.SimpleClass"), ComVisible(True)> Public Class SimpleClass
        Implements ITestClass
        Public Function HelloWorld() As String Implements ITestClass.HelloWorld
            Dim assembly As Assembly
            Dim configuration As Configuration
            Dim map As ExeConfigurationFileMap
            Dim str As String
            Dim uri As Uri
            map = New ExeConfigurationFileMap
            [assembly] = assembly.GetCallingAssembly
            uri = New Uri(Path.GetDirectoryName([assembly].CodeBase))
            map.ExeConfigFilename = Path.Combine(uri.LocalPath, ([assembly].GetName.Name & ".dll.config"))
            str = ConfigurationManager.OpenMappedExeConfiguration(map, 0).AppSettings.Settings.Item("MyString").Value             If String.IsNullOrEmpty(str) <> True Then
                HelloWorld = str
            Else
                HelloWorld = "Hello World, .net DCOM(vb.net)"
            End If         End Function     End Class
End Namespace

app.config配置文件如下(编译后会自动生成test.dll.config文件):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="MyString" value="Hello World"/>    
  </appSettings>
</configuration>

编译发布之后,运行以下command将其注册为DCOM

regasm test.dll /codebase /tlb

说明:如果.net dll要注册成为COM的话,需要几个必备的条件:

1. dll要设置相应的System.runtime.InteropServices的相应attribute,如山代码所示。

2. (C#中)assemblyinfo.cs中, comvisible要设置为true。

3. 生成dll assembly的时候,一定要选中 Register for ComInterop复选框,如下所示

然后,通过asp调用该DCOM如下:

<%
set obj=CreateObject("AnotherDCOM.SimpleClass")
Response.write obj.HelloWorld()
%>

通过procmon我们可以看到,该dll.config被争取读取了:)

c# 如何使用DLL的config文件中的信息的更多相关文章

  1. 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)

    原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...

  2. Web.config 文件中的 system.webServer

    Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...

  3. web.config文件中配置数据库连接的两种方式

    web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报    分类: 数据库(74)  在网站开发 ...

  4. Machine.config 文件中节点<machineKey>的强随机生成

    Machine.config 文件中节点<machineKey>的强随机生成 <machineKey>这个节允许你设置用于加密数据和创建数字签名的服务器特定的密钥.ASP.NE ...

  5. 如何在web.config文件中配置Session变量的生命周期

    实例说明:在网上购物商城中,为了维护在线购物环境,一般只有注册会员才可以购买商品.实现购物功能时,先通过Session变量记录会员的登录名,然后在购买商品页面通过判断会员是否登录确定其能否购买商品. ...

  6. C# 关于config文件中的usersettings

    在调整app.config的时候遇到了一点问题,把这个问题记录下来,可能我只是没有找到解决方案,问题本身也许并不复杂. 在VS中通过Properties中的Settings.settings来设置作用 ...

  7. jmeter csv Data Set Config 文件中带引号的数据转换问题(自动添加双引号解决办法)

    1.我们从csv中获取数据,在jmeter中使用这些数据,其中csv的数据如图,有的数据包含引号. 2.问题:我们获取的json数据,被自动添加了双引号 3.解决方式: 在CSV Data Set C ...

  8. (转)linux sudo 重定向,实现只有系统管理员才有权限操作的文件中写入信息

    众所周知,使用 echo 并配合命令重定向是实现向文件中写入信息的快捷方式. 本文介绍如何将 echo 命令与 sudo 命令配合使用,实现向那些只有系统管理员才有权限操作的文件中写入信息.   比如 ...

  9. c++------------提取文件中的信息

    对于文件比较复杂的时候,为了获取文件中的信息,需要一些比较特殊的函数,比如,getline().replace().atoi,atof等 例子一,读取以下文件中的数据,并保存进一个类里面. 首先,类的 ...

随机推荐

  1. bzoj3413

    SAM好题,显然我们不能与每个后缀都去算LCP 考虑对询问串每一位算贡献,先构建出逆序构建自动机,这样我们得到了原串的后缀树(parent树) 根据parent树的定义,一个节点对应字符串出现的位置对 ...

  2. Oracle AWR报告自动生成并ftp脚本

    脚本主要由以下几个部分组成: awr.sql 用来在sqlplus 中执行的脚本,该脚本从网上直接找的. awr.sh 用来调用sqlplus来生成awr报告. ftp.sh 用来打包压缩每天生成的a ...

  3. jvm内部现成运行

    hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来 ...

  4. TCP/IP详解学习笔记(9)-TCP协议概述

    终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读.前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西. TCP和UDP处在同一层---运输 ...

  5. HTML5全球普及加速:有望终结iOS与安卓界限【转】

    HTML5或将成为未来移动互联网时代的颠覆者. 5年前,当第一台iPhone诞生时,乔布斯断然拒绝了FlashPlayer,而选择HTML5(新型网页标准)取代Flash的功能.他曾预言,“虽然现阶段 ...

  6. [转] GIS二次开发(C#+AE)

    乘风莫邪 原文GIS二次开发(C#+AE) 此过程描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <</FONT>安装目录>/ ...

  7. Google服务背后的天文数字

    每天当我们在互联网上驰骋的时候,在背后支撑网页.应用.服务运转的就是各种编程语言和代码.无论是Gmail确认收件箱还是执行关键词搜索都需要大量的代码,但是你知道Google的各项互联网服务合起来需要多 ...

  8. CCMoveTo 等函数理解

    CCMoveTo: 使用CCMoveTo action来让对象从右侧屏幕外移动到屏幕左侧.注意可以通过指定duration参数控制这一过程需要多久,这里我们随机给他2-4秒的时间. CCCallFun ...

  9. <转>详解DNS的常用记录(下):DNS系列之三

    在上篇博文中我们介绍了DNS服务器中几种不可或缺的记录,包括A记录,NS记录和SOA记录.本篇博文中我们将继续为大家介绍DNS的另外几种常用记录,希望能对大家了解DNS有所帮助. 四 MX记录 MX记 ...

  10. [转]关于GCD与多线程

    GCD是什么,你知道吗?你知道了GCD,你确定你会使用吗? 这一篇文章是站在初学者角度去分析GCD,原因是这个很多iOS开发者根本就没用过,即使用过,不知道其中的原理.讲解之前认识一下什么是线程,为什 ...