2010-06-22 13 views
1

Dans .NET, j'ai développé une bibliothèque client pour mon service WCF.Client WCF de VBA

J'ai enregistré l'assembly pour COM interop afin que je puisse effectuer des appels à la bibliothèque à partir de VBA.

Cependant, depuis l'exécutable en utilisant la bibliothèque ne se construit pas dans le cadre .NET, les fonctions de bibliothèque ne sont pas capables de trouver le fichier de configuration qui définit les liaisons de service (« app.config » dans le projet visual studio)

Y at-il un moyen pour moi de spécifier le chemin où le fichier de configuration devrait être assis?

Merci

Répondre

1

La bonne façon de le faire est de ne pas COM-activer directement le client WCF, mais d'écrire une cale personnalisée qui tournera un nouveau AppDomain, créer client, et renvoyer l'IDispatch du client à l'appelant COM. Une fois que vous créez votre propre AppDomain, vous pouvez charger son fichier de configuration à partir de n'importe quel emplacement que vous voulez. Avec AppDomainManager introduit dans 2.0, vous n'avez même pas besoin d'écrire un shim non géré - vous pouvez écrire un petit shim ComVisible 100% géré qui charge votre client WCF dans son propre domaine. J'ai utilisé cette technique pour un certain nombre de grands projets qui devaient s'exécuter dans Excel (le même problème que vous avez eu - une mauvaise forme pour déposer un fichier Excel.exe.config dans un emplacement partagé), et cela fonctionne très bien.

1

Même si vous avez une application Win32 « native », vous pouvez toujours mettre un fichier de configuration appelé MyApp.exe.config droite dans le même répertoire que l'application, et les parties .NET devriez être en mesure de trouver et d'interpréter ce fichier de configuration.

Votre application VB ne saura rien de ce fichier de configuration et ne fera rien avec elle - mais votre bibliothèque client .NET le trouvera et l'utilisera.

J'ai utilisé cette technique pour intégrer des composants de code C# dans une application C++/Win32 native - fonctionne comme un charme pour moi.

Il a besoin d'un entièrement compilé, le fichier EXE natif pour que cette méthode fonctionne - pas sûr si votre projet VBA propose que, bien que ...


Si vous ne pouvez pas vivre avec cette option, la En réalité, seule une autre option consiste à définir et charger le fichier de configuration par programme. Vous ne pouvez pas définir/spécifier l'emplacement du fichier de configuration - mais vous pouvez charger un fichier de configuration spécifique dans le code et l'utiliser (presque le même que le fichier de configuration par défaut).

Vérifiez la méthode ConfigurationManager.OpenMappedExeConfiguration:

// you need to define a ExeConfigurationFileMap that defines what file to use 
ExeConfigurationFileMap exeMap = new ExeConfigurationFileMap(); 
exeMap.ExeConfigFilename = @"C:\Application\Default.config"; 

// then, you need to load that file with the ConfigurationManager 
Configuration exeConfig = 
    ConfigurationManager.OpenMappedExeConfiguration(exeMap, ConfigurationUserLevel.None); 

// now you can access parts of that config 
string someValue = exeConfig.AppSettings.Settings["SomeValue"].Value; 
string connStr = exeConfig.ConnectionStrings.ConnectionStrings["Default"].ConnectionString; 
+0

Cela ne fonctionne pas. Malheureusement, je ne pense pas qu'un système de production devrait se contenter de contaminer le répertoire MS Office avec ses propres fichiers, donc je voudrais trouver une solution qui me permette de choisir l'emplacement du fichier de configuration. – mcoolbeth