C# 将app.config中的值从一个控制台应用程序传递到一个类库

C# 将app.config中的值从一个控制台应用程序传递到一个类库,c#,azure,azure-webjobs,C#,Azure,Azure Webjobs,在我的控制台应用程序中,app.config上有这个 <appSettings> <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://xx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xx/KrM="/> </appSettings>

在我的控制台应用程序中,app.config上有这个

 <appSettings>
    <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://xx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xx/KrM="/>
  </appSettings>
但是,我想将Queing方法隔离在另一个类库中,因此ReceiveMessage的实际实现在另一个类库中

 /// <summary>
        /// Receives a message
        /// </summary>
        /// <param name="queuName"></param>
        public static void ReceiveMessage(string queuName)
        {
            QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");

            // Configure the callback options
            OnMessageOptions options = new OnMessageOptions();
            options.AutoComplete = false;
            options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

            // Callback to handle received messages
            Client.OnMessage((message) =>
            {
                try
                {
                    Empresa empresa = GetBody<Empresa>(message);
                    // Process message from queue
                    //Console.WriteLine("Body: " + );
                    Console.WriteLine("MessageID: " + message.MessageId);

                    // Remove message from queue
                    message.Complete();
                }
                catch (Exception ex)
                {
                    // Indicates a problem, unlock message in queue
                    message.Abandon();
                }
            }, options);
        }
//
///收到消息
/// 
/// 
公共静态void ReceiveMessage(字符串queuName)
{
QueueClient=QueueClient.CreateFromConnectionString(connectionString,“Empresa”);
//配置回调选项
OnMessageOptions=新建OnMessageOptions();
options.AutoComplete=false;
options.AutoRenewTimeout=TimeSpan.FromMinutes(1);
//回调以处理收到的消息
Client.OnMessage((message)=>
{
尝试
{
Empresa Empresa=GetBody(消息);
//处理来自队列的消息
//Console.WriteLine(“正文:+);
Console.WriteLine(“MessageID:+message.MessageID”);
//从队列中删除消息
message.Complete();
}
捕获(例外情况除外)
{
//表示出现问题,请解锁队列中的消息
消息。放弃();
}
},选项);
}
问题是它试图从app.config获取连接字符串信息,而app.config是该库的本地信息,而不是调用方的本地信息

所以我得到一个空连接字符串

现在,我不想在我的类库项目中重复应用程序设置,如何以及什么是实现这一点的最佳方法


其中一个原因是,最终此控制台应用程序将作为WebJob安装在Azure中,Azure有一个接口可以更改WebJob的应用程序设置,但不能更改类库的应用程序设置。

使用反射,您可能能够从调用程序集获得应用程序配置

下面是一个示例代码

public static void ReceiveMessage(string queuName)
    {
        var assembly = Assembly.GetCallingAssembly();

        string configPath = new Uri(assembly.CodeBase).LocalPath;
        var configManager = ConfigurationManager.OpenExeConfiguration(configPath);
        var connectionString = configManager.ConnectionStrings.CurrentConfiguration.AppSettings.Settings["Microsoft.ServiceBus.ConnectionString"];


        QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");

        // Configure the callback options
        OnMessageOptions options = new OnMessageOptions();
        options.AutoComplete = false;
        options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

        // Callback to handle received messages
        Client.OnMessage((message) =>
        {
            try
            {
                Empresa empresa = GetBody(message);
                // Process message from queue
                //Console.WriteLine("Body: " + );
                Console.WriteLine("MessageID: " + message.MessageId);

                // Remove message from queue
                message.Complete();
            }
            catch (Exception ex)
            {
                // Indicates a problem, unlock message in queue
                message.Abandon();
            }
        }, options);
    }
ConfigurationManager
System.Configuration
组件的一部分

如果你有一个更复杂的场景,那么请发布详细信息,我将尝试找出解决方案

public static void ReceiveMessage(string queuName)
    {
        var assembly = Assembly.GetCallingAssembly();

        string configPath = new Uri(assembly.CodeBase).LocalPath;
        var configManager = ConfigurationManager.OpenExeConfiguration(configPath);
        var connectionString = configManager.ConnectionStrings.CurrentConfiguration.AppSettings.Settings["Microsoft.ServiceBus.ConnectionString"];


        QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "Empresa");

        // Configure the callback options
        OnMessageOptions options = new OnMessageOptions();
        options.AutoComplete = false;
        options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

        // Callback to handle received messages
        Client.OnMessage((message) =>
        {
            try
            {
                Empresa empresa = GetBody(message);
                // Process message from queue
                //Console.WriteLine("Body: " + );
                Console.WriteLine("MessageID: " + message.MessageId);

                // Remove message from queue
                message.Complete();
            }
            catch (Exception ex)
            {
                // Indicates a problem, unlock message in queue
                message.Abandon();
            }
        }, options);
    }