• c# 如何使用DLL的config文件中的信息


    我知道用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被争取读取了:)

  • 相关阅读:
    GCD 使用说明
    iOS操作系统的层次结构
    Objective-C 类型转换
    UIView和Masonry实现动画效果
    iOS 常用手势
    SDUT 2610 Boring Counting(离散化+主席树区间内的区间求和)
    HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
    NBUT 1525 Cow Xor(01字典树+前缀思想)
    HDU 4825 Xor Sum(经典01字典树+贪心)
    HDU 1069 Monkey and Banana(二维偏序LIS的应用)
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/dfgsdft5464654.html
Copyright © 2020-2023  润新知