C# 如何使用配置节处理程序导入具有App.config的.NET DLL?
我正在尝试使用内部.net应用程序中的DLL DLL有一个App.config文件,并有一个指定配置处理程序的配置部分 我无法获取PowerShell脚本以加载此dll 我已把这个问题归结为我能做到的最简单的形式 以下是我正在尝试的PowerShell脚本:C# 如何使用配置节处理程序导入具有App.config的.NET DLL?,c#,.net,powershell,exception-handling,app-config,C#,.net,Powershell,Exception Handling,App Config,我正在尝试使用内部.net应用程序中的DLL DLL有一个App.config文件,并有一个指定配置处理程序的配置部分 我无法获取PowerShell脚本以加载此dll 我已把这个问题归结为我能做到的最简单的形式 以下是我正在尝试的PowerShell脚本: [appdomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "D:\CustomConfig\CustomConfig\CustomConfigTestHarness\bin\Debug\Cu
[appdomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "D:\CustomConfig\CustomConfig\CustomConfigTestHarness\bin\Debug\CustomConfigTestHarness.exe.config")
Add-Type -Path 'D:\CustomConfig\CustomConfig\CustomConfigTestHarness\bin\Debug\CustomConfig.dll'
$mainClass = New-Object CustomConfig.Main
$mainClass.TestConfig()
这是配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="PrimarySqlServers" type="CustomConfig.ServerConfiguration, CustomConfig" />
</configSections>
<PrimarySqlServers>
<Server name="data source=SQL\SQL2005; Initial Catalog=master; Trusted_Connection=yes;"/>
</PrimarySqlServers>
</configuration>
configClass.cs文件的内容如下:
using System;
using System.Configuration;
using System.Diagnostics;
namespace CustomConfig
{
/// <summary>
/// Contains individual configuration information about a site to be deployed
/// </summary>
public class ServerConfiguration : ConfigurationSection
{
/// <summary>
/// Get the collection of assembly items
/// </summary>
[ConfigurationProperty("", IsDefaultCollection = true)]
public ServerConfigurationCollection ServerList
{
get { return (ServerConfigurationCollection) base[""]; }
}
}
/// <summary>
/// ContextCollection - represents the collection of context nodes
/// </summary>
public class ServerConfigurationCollection : ConfigurationElementCollection
{
/// <summary>
/// Get the assembly item element with the given name
/// </summary>
/// <param name="name">The name of the item you want</param>
/// <returns>The item specified</returns>
public new ServerConfigurationEntry this[string name]
{
get
{
if (IndexOf(name) < 0) return null;
return (ServerConfigurationEntry) BaseGet(name);
}
}
/// <summary>
/// Get a assembly item element by index
/// </summary>
/// <param name="index">The index of the item to get</param>
/// <returns>The item specified</returns>
public ServerConfigurationEntry this[int index]
{
get { return (ServerConfigurationEntry) BaseGet(index); }
}
/// <summary>
/// Clear the collection of items
/// </summary>
public void Clear()
{
BaseClear();
}
/// <summary>
/// Add a new item to the collection
/// </summary>
/// <param name="name">The name of the site to add</param>
public void AddItem(string name)
{
ServerConfigurationEntry newEntry = new ServerConfigurationEntry();
newEntry.Name = name;
this.BaseAdd(newEntry, true);
}
/// <summary>
/// Get the index of a given assembly item
/// </summary>
/// <param name="name">The name of the item to get the index of</param>
/// <returns>The index of the given item, or -1 if not found</returns>
public int IndexOf(string name)
{
for (int index = 0; index < base.Count; index++)
{
if (string.Compare(this[index].Name, name, StringComparison.OrdinalIgnoreCase) == 0)
return index;
}
return -1;
}
/// <summary>
/// Get the type of collection. BasicMap in this case.
/// </summary>
public override ConfigurationElementCollectionType CollectionType
{
get { return ConfigurationElementCollectionType.BasicMap; }
}
/// <summary>
/// Factory up a new element
/// </summary>
/// <returns>A new element</returns>
protected override ConfigurationElement CreateNewElement()
{
return new ServerConfigurationEntry();
}
/// <summary>
/// Get the unique key for a assembly item element
/// </summary>
/// <param name="element">The element to get the key for</param>
/// <returns>A unique identifier for the element</returns>
protected override object GetElementKey(ConfigurationElement element)
{
return ((ServerConfigurationEntry) element).Name;
}
/// <summary>
/// Get the XML element name for elements of this type
/// </summary>
protected override string ElementName
{
get { return "Server"; }
}
}
/// <summary>
/// ContextElement - represents a single context element in the config
/// </summary>
[DebuggerDisplay("{Name}")]
public class ServerConfigurationEntry : ConfigurationElement
{
private const string NAME = "name";
/// <summary>
/// Get or set the server name or connection string
/// </summary>
[ConfigurationProperty(NAME, DefaultValue = "", IsRequired = true, IsKey = true)]
public string Name
{
[DebuggerStepThrough]
get { return (string) this[NAME]; }
[DebuggerStepThrough]
set { this[NAME] = value; }
}
}
}
嗯,我认为在自定义配置部分中,程序集名称不正确 根据您的帖子,这应该是:
<section name="PrimarySqlServers" type="CustomConfig.ServerConfiguration, CustomConfigTestHarness.exe" />
第二个参数是包含CustomConfig.ServerConfiguration类型定义的程序集或可执行文件名。您遇到的问题是程序集不在.net的程序集搜索路径中 您可以通过许多不同的方式(包括将程序集放在GAC中等)修复该问题 将有关程序集的其余信息添加到您的节密钥(版本、区域性、公钥令牌…类似以下内容)中可能就足够了:
<section name="PrimarySqlServers" type="CustomConfig.ServerConfiguration, CustomConfig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
另一种方法是将dll放在应用程序的主目录中。
但在这种情况下,这是您的Windows\System32\WindowsPowerShell\v1.0\…所以这可能不是一个好计划。据我所知,CustomConfig.ServerConfiguration没有定义TestEcho方法在哪里工作?如果没有,您可以检查,感谢您查看我的问题。是的,TestEcho工作正常。你好,Kieren,感谢您阅读我的任务ion.您是对的,很抱歉我没有添加configclass.cs文件。谢谢David,我忘记添加configclass.cs文件了,我现在已经包含了它。一个有用的注意事项是非常少使用处理程序块中的其他引用。使用
join path
或System.IO.path.Combine
导致重新进入AssemblyResolve处理程序,它依次执行重新进入处理程序的语句,等等,最终导致StackOverflowException。谢谢,我也遇到了同样的问题,添加其余信息对我来说很有用(版本=1.0.0.0,区域性=中立,PublicKeyToken=null)
<section name="PrimarySqlServers" type="CustomConfig.ServerConfiguration, CustomConfigTestHarness.exe" />
<section name="PrimarySqlServers" type="CustomConfig.ServerConfiguration, CustomConfig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
$configdll = 'D:\CustomConfig\CustomConfig\CustomConfigTestHarness\bin\Debug\CustomConfig.dll'
[System.AppDomain]::CurrentDomain.add_AssemblyResolve({
param($source, $assembly)
# Detect that they're looking for YOUR assembly specifically
if($assembly.Name.Split(",")[0] -eq "CustomConfig") {
# And load it for them: your path will be difference
return [System.Reflection.Assembly]::LoadFile( $configdll )
}
})