2010-05-07 11 views
3

J'ai une DLL qui contient du code généré par Subsonic et un code augmenté pour accéder à un modèle de données. En fait, il s'agit d'une DLL fusionnée de cet assemblage original, Subsonic lui-même et quelques autres DLL référencées en un seul assemblage, appelé "PowershellDataAccess.dll" Cependant, il convient de noter que j'ai également essayé de référencer chaque assembly individuellement dans le Je tente également d'utiliser les objets et les méthodes de cet assemblage, dans ce cas, j'accède à une classe qui utilise Subsonic pour charger un tas d'enregistrements et créer des scripts. Le problème que je rencontre est que l'appel à la méthode Subsonic pour extraire des données de la base de données indique qu'il ne peut pas trouver la chaîne de connexion. fichier de configuration approprié qui contient cette chaîne de connexion, de nom.Accès subsonique aux chaînes de connexion App.Config à partir de la DLL référencée dans Powershell Script

Voici le script.

$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"); 

Je suis allé creuser dans Subsonic lui-même et la ligne suivante dans Subsonic est ce que cherche la chaîne de connexion et de jeter l'exception:

ConfigurationManager.ConnectionStrings[connectionStringName] 

Ainsi, par curiosité, je créé un assemblage avec un classe unique qui a une seule propriété qui exécute juste cette ligne pour récupérer le nom de la chaîne de connexion.

J'ai créé un ps1 qui a appelé cet assembly et a atteint cette propriété. Ce prototype peut trouver la chaîne de connexion très bien.

Quelqu'un at-il une idée de la raison pour laquelle la partie de Subsonic ne semble pas voir les chaînes de connexion?

Répondre

7

Avez-vous ajouté l'assembly System.Configuration à votre session PowerShell? Les travaux suivants pour moi:

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; 
... 
+0

J'ai essayé d'autres prototypes où * mon * code va après les chaînes de connexion à travers ConfigurationManager. Tout le monde travaille. C'est seulement quand je passe le contrôle au code Subsonic et que Subsonic fait appel à ConfigurationManager pour que la configuration semble disparaître. –

+0

Chargez-vous l'assembly System.Configuration.dll dans PowerShell avant d'appeler le code généré Subsonic? Si oui, alors pourriez-vous lister les informations d'erreur, par ex. '$ erreur [0] | fl * -force' –