Дозвуковой доступ к строкам подключения App.Config из ссылочной DLL в скрипте Powershell - PullRequest
3 голосов
/ 07 мая 2010

У меня есть библиотека DLL, которая содержит сгенерированный и дополненный Subsonic код для доступа к модели данных. На самом деле, это объединенная DLL этой исходной сборки, самой Subsonic и нескольких других DLL-библиотек, на которые есть ссылки, в одну сборку, называемую «PowershellDataAccess.dll. скрипт, и это тоже не работает.

Затем я пытаюсь использовать объекты и методы в этой сборке. В этом случае я обращаюсь к классу, который использует Subsonic для загрузки группы записей и создает индекс Lucene из этих записей.

Проблема, с которой я сталкиваюсь, заключается в том, что вызов метода Subsonic для извлечения данных из базы данных говорит, что он не может найти строку подключения. Я указываю AppDomain на соответствующий файл конфигурации, который содержит эту строку подключения, по имени.

Вот сценарий.

$ScriptDir = Get-Location
[System.IO.Directory]::SetCurrentDirectory($ScriptDir)
[Reflection.Assembly]::LoadFrom("PowershellDataAccess.dll")
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "$ScriptDir\App.config")
$indexer = New-Object LuceneIndexingEngine.LuceneIndexGenerator
$indexer.GeneratePageTemplateIndex("PageTemplateIndex");

Я копался в самой Subsonic, и следующая строка в Subsonic - это то, что ищет строку подключения и выдает исключение:

ConfigurationManager.ConnectionStrings[connectionStringName]

Итак, из любопытства я создал сборку с одним классом, который имеет единственное свойство, которое просто запускает эту одну строку для получения имени строки подключения.

Я создал ps1 с именем , который сборка, и поразил это свойство. Этот прототип может найти строку подключения просто отлично.

Кто-нибудь знает, почему часть Subsonic не может видеть строки подключения?

1 Ответ

7 голосов
/ 09 мая 2010

Вы добавили сборку System.Configuration в сеанс PowerShell? У меня работает следующее:

PS> gc .\app.config

<?xml version='1.0' encoding='utf-8'?>
<configuration>
    <connectionStrings>
      <clear />
      <add name="Name"
           providerName="System.Data.ProviderName"
           connectionString="Valid Connection String;" />
    </connectionStrings>
</configuration>

PS> [appdomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "$home\app.config")
PS> Add-Type -AssemblyName System.Configuration
PS> [Configuration.ConfigurationManager]::ConnectionStrings['Name']

Name                    : Name
ConnectionString        : Valid Connection String;
...
...