2009-12-29 4 views
0

J'ai créé une application Windows qui utilise Office.dll et PowerPoint dll de Microsoft Office 2003. Au moment de la conception, quand je suis ajoutais référence à ces dll à mon projet, il fait référence suivant chemin:Office 2003: Impossible de trouver Microsoft.Office.Interop.PowerPoint dll

C:\WINDOWS\assembly\GAC\Microsoft.Office.Interop.PowerPoint\

l'application fonctionne parfaitement sur la machine où il est développé, mais quand je suis en train de l'exécuter sur une autre machine elle échoue. L'exception qu'il lance est la suivante:

System.Reflection.TargetInvocationException: Une exception a été émise par la cible d'un appel. ---> System.IO.FileNotFoundException

J'ai essayé de trouver le chemin ci-dessus sur ma machine de test, mais je suis surpris de constater que, si Office 2003 et 2007 est installé (2 machines différentes), ce dossier n'est pas présent là-bas.

Quelqu'un peut-il m'aider à résoudre ce problème?

Répondre

1

1.Il existe un package redistribuable PIA (Primary Interop Assemblies) Office 2003 qui est un package Microsoft Windows Installer contenant les produits Primary Interop Assemblies pour Microsoft Office 2003 que vous pouvez obtenir auprès de here. comprend un ensemble dont vous avez besoin

2.You peut définir fidèle à la touche « Copie locale » pour cet assemblage dans votre projet fait référence à des propriétés, dans ce cas, il serait copié dans le dossier de sortie de votre projet

3 .Vous n'en avez pas vraiment besoin pour travailler avec les applications MS Office, même si cela facilite les choses. Voici un exemple de la façon dont vous pouvez ouvrir une présentation sans classes Interop

Type officeType = Type.GetTypeFromProgID("PowerPoint.Application"); 
object officeInstance = Activator.CreateInstance(officeType); 
// set visible 
object value = -1; 
officeType.InvokeMember("Visible", BindingFlags.SetProperty, null, officeInstance, new object[] { value }); 
// open presenation 
object objTrue = -1; 
object objFalse = 0; 
object fileNameObj = presentation_file_name; 
object documents = officeType.InvokeMember("Presentations", BindingFlags.GetProperty, null, officeInstance, null); 
documents.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, documents, new object[] { fileNameObj, objTrue, objFalse, objTrue }); 

n'a pas testé celui exact, mais smth comme ça fonctionne très bien pour moi, ce qui concerne

+0

Merci mon pote. Chargement de l'ensemble de façon dynamique, fonctionne correctement. Mais mon problème est, sur la machine cible, je n'ai pas de dossier GAC.Si j'installe PIA, il fonctionne avec la version Office avec Reflection. Je ne veux pas distribuer des assemblys Microsoft avec mon application, car cela pourrait causer une menace potentielle. Et l'installation de PIA sur chaque machine cible n'est pas faisable. –

+0

Je suppose que vous êtes dans l'impasse ici; Il n'y a pas d'assemblys nécessaires dans les dossiers GAC sur les machines cibles et vous ne voulez pas \ ne pouvez pas les installer, donC# 1 ne fonctionne pas. Vous ne souhaitez pas non plus regrouper des assemblages interopérables avec vos applications. cela signifie que # 2 ne s'applique pas non plus. –

0

La DLL d'interop que vous recherchez est installée sur votre machine de développement dans le GAC. En tant que tel, il ne fait pas partie du déploiement standard. Vous devez le copier à la main.

Une autre option (et peut-être une plus propre) consisterait à exécuter l'installation d'Office sur la machine cible et de laisser l'installation de tout ce qui est nécessaire. Assurez-vous que vous avez sélectionné les options correctes

+0

J'ai essayé PIA pour les deux versions de bureau , il a fonctionné pour le bureau 2007, mais le problème existe toujours pour le bureau 2003. Je devine, j'ai installé le bureau 2003 en mode typique. –

Questions connexes