VS 2010 debugging outlook RibbonExtensibility UI xml - visual-studio-2010

When creating a RibbonExtensibility class for, say, adding custom context menu buttons, is there some way in VS to debug whether the XML you are returning in GetCustomUI is actually valid?
For example, if my XML tries to use a non-existent idMso, I'd like VS to inform me of this somehow.

You need to enable addin error reporting in Outlook: File | Options | Advanced | Developers | Show add-in user interface errors.

See How to: Show Add-in User Interface Errors in MSDN.

Related

Is there a way to parse text as the user is typing an Outlook message?

I'd like to write an Outlook add-in that would parse text being typed by the user.
The goal - if the user types a sequence of characters, the add-in would perform some action.
Example: As the user types "##someone" the add-in would recognize the pattern "\#\#\w{1}" and perform some action.
The problem is I have not found a way to inspect what the user is typing.
Is this restricted? If so, looks like the only option would be to hook into the Send() event and inspect the message then - less ideal.
I'd like to write this add-in in Visual Studio 2010 for Outlook 2010
Any ideas welcomed.
I believe what you're looking for is "Smart Tags". This should provide you a good overview and a direction to go: http://msdn.microsoft.com/en-us/library/vstudio/ms178786%28v=vs.100%29.aspx
Here's the SDK: http://msdn.microsoft.com/en-us/library/vstudio/aa169576.aspx
And a basic tutorial: http://www.add-in-express.com/docs/net-smart-tags.php
Hope this helps.
Have you tried to use MailItem.Body?
Also, Application.AcvtiveInspector.WordEditor will return an instance of the Word's Document object that you should be able to access and manipulate the text as the user types it.

outlook addin goes straight to inactive application addins

My Outlook addin MSI installs the addin (It is listed in Add\Remove programs) but sends it straight to inactive application addins.
How can I fix this?
Check the LoadBehavior key value for your plugin.
HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\Addins\%your add in%\LoadBehavior
If you see the registry hive for you add-in - it's most likely to be installed correctly.
The LoadBehavior value should be 3 before you start Outlook. If it's not, set it to 3.
If it goes to 2 when you start Outlook - it is definitely trying to run it, so it's good news in a way.
You will need to do some diagnostics there - try instantiating your add-in from vbs
set c = CreateObject("EnthusiasticDeveloper.OutlookAddIn")
This should give you no errors.
If it doesn't and the object is instantiated - you need to put diagnostics in your add-in.
It is being called by Outlook and your most likely to get enough control to instantiate log4net.
HTH
It seems the MS Outlook started evaluating the add-ins that directly affect product overall performance and set them as inactive. I found this article that indicates the windows registry entry for DisabledItems (HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Outlook\Resiliency\DisabledItems). It is much likely to your add-in be listed on this folder. Backup the related entry before removing it.
See detailed information on this accessing:
http://www.outlook-apps.com/inactive-outlook-add-ins/
Cheers,
Vieira
This probably happens because the load behavior is not set correctly. This article can help you: http://msdn.microsoft.com/en-us/vsto/ff937654.aspx#Create

Outlook addin has failed to find Office control by ID

I've just built an MS Outlook Add In using Visual Studio and Office 2010. I've installed it ok on 4 machines, but one user is getting the following error -
Error found in Custom UI XML of "...."
...
...
Failed to find Office control by ID
Everyone is running Windows 7 and Outlook 2010 - not sure why this person is having a problem. Can anyone suggest how to diagnose this?
For those having similar issues, you don't have to remove any add-in.
What is happening is: Outlook will try to load all ribbons (found in your ribbon xml) into any window the user goes to. Then it'll complain about not finding ID x or y.
Just make sure your GetCustomUI method in Ribbon.cs does not load the entire ribbon XML at once but rather loads it per fragment.
If you're not sure what IDs you need to target, use a breakpoint in GetCustomUI then start Outlook, surf different views (main, new email, new appointment, calendar...etc) in order to gather the IDs for the views wherein you need to show you add-in.
In my case, I needed Microsoft.Outlook.Explorer, Microsoft.Outlook.Mail.Compose and Microsoft.Outlook.Appointment.
Therefore I changed my GetCustomUI to:
public string GetCustomUI(string ribbonID)
{
switch (ribbonID)
{
case "Microsoft.Outlook.Explorer":
return GetResourceText("MyAddin.RibbonsForOutlookExplorer.xml");
case "Microsoft.Outlook.Mail.Compose":
return GetResourceText("MyAddin.RibbonForOutlookMailCompose.xml");
case "Microsoft.Outlook.Appointment":
return GetResourceText("MyAddin.RibbonForOutlookAppointment.xml");
default:
return null;
}
}
Of course, I had to break down my Ribbon.xml into the three XML files mentioned above. The result: Outlook will ONLY load the fragment needed for a given screen (appointment, new email ...) and will not complain about "not finding an ID on screen X or Y".
Finally, for those who are not sure why some users get that error while others don't: it's because of "Show add-in user interface errors" option (in Options -> Advanced). If that is unchecked then Outlook will ignore the malformed ribbon XML errors. If it checked, users will get related errors about your add-in (if any exists) and also about other add-ins.
If it works for everyone except one user. As #Brijesh Mishra mentioned check if the user has got any other addin and if he is having own quick access tool bar customized.
If he has got any of this then, remove the other addins and try to install or reset the quick access tool bar customization.
For all of you that use a Designer-based VSTO plugin, and not the XML solution.
I searched all the web for this problem, but only found XML-based solutions.
There's nothing for Visual Designer on the web, because in this case you don't have to override the "GetCustomUI" method.
Ribbons designed by using the Visual Designer return a RibbonManager by default.
This RibbonManager object represents all Ribbon (Visual Designer) items in the project and is automatically handled in background through the active window inspector.
So you don't have to write any special code to handle different windows.
To configure it correctly you just have to:
Add one extra Visual Designer Ribbon for every window the user goes to
in the Ribbon Object go under "RibbonType", open the checkbox list an only activate the corresponding window, where the ribbon should appear.
If there is more than one window checked in the list, Outlook trys to insert the ribbon in all the marked windows. Even if the corresponding window is currently not opened. That's the reason, why the error "Failed to find control ID" appears.
the actual fix for me was to separate the ribbon XML files containing the customUI and redirecting to the correct one in the GetCustomUI method (implemented using Office.IRibbonExtensibility)
in example:
public string GetCustomUI(string RibbonID)
{
switch (RibbonID)
{
case "Microsoft.Outlook.Mail.Read":
return GetResourceText("namespace.type1.xml");
case "Microsoft.Outlook.Mail.Compose":
return GetResourceText("namespace.type2.xml");
default:
return null;
}
}

How to debug Sharepoint solution/feature through Visual studio?

Recently I tried to install a webpart through wspbuilder utility to the Sharepoint Site. I have created, built and deployed a project to the 12 hive. After that installed the solution through Cental Administration Site and activated in the site collection.
I just wonder how can I debug the complex feature/solution ? Because both processes (build-deploy and activate) totally independent, how can I attach a process with the worker process ?
In the WSPBuilder context menu there is an option "Attach to IIS worker process". As long as the app is loaded (generally means that you have accessed a page in the SharePoint site before trying to attach) and the code deployed in SharePoint is the same as the code you have in Visual Studio, you should be able to set breakpoints and step through the code.
First, you need to open up your browser and navigate to the SharePoint website in question. Then, In Visual Studio, go to Debug --> Attach to Process, and find the w3wp.exe process associated with the Sharepoint website that you want to debug. Click it (the process) and then click the Attach button. You should now be able to debug any activities associated with your SharePoint feature.
Sometimes it is a bit of a pain to figure out which w3wp process to attach to. Try adding the following to your code to break into the debugger:
System.Diagnostics.Debugger.Break();
System.Diagnostics.Debugger.Break()
Like Muhimbi suggested, this is actually very useful in certain cases. Say you want to debug custom code (e.g. feature_deactivating event) when it might be invoked with stsadm and not the browser. (for e.g. you will have to use stsadm for feature deactivation when feature is hidden in UI).When using stsadm you cannot attach to cmd.exe because that's a separate process. If you type the command and hit enter and then find its id of stsadm.exe process to attach to, its too late. In situations like these, the command above is the easist and best solution
I tried the steps as mentioned here
go to Debug --> Attach to Process, and find the w3wp.exe process associated with the Sharepoint website that you want to debug
But I get "Breakpoints will not be hit, no symbols have currently been loaded for this document". Should I have to register the custom deployed solution dll using GACUTIL ? Should I have to copy the PDB files at any particular location ?
What am I missing here ?

How can an add-in detect when a solution is loaded?

How can my add-in detect when a solution is loaded? I know there must be some event somewhere in the DTE model, but I can't find it. My add-in loads when Visual Studio loads, but it depends on a solution being open. I don't want to make it a solution add-in until MS loses their sick fixation on COM, as solution add-ins have to be COM components.
Here's how to register for event handling using C#:
_solutionEvents = _applicationObject.Events.SolutionEvents;
_solutionEvents.Opened += new _dispSolutionEvents_OpenedEventHandler(SolutionOpened);
_solutionEvents.AfterClosing += new _dispSolutionEvents_AfterClosingEventHandler(SolutionClosed);
Also note that when user opens Visual Studio by double clicking on a solution file, you won't get an event for solution opening. You should check whether _applicationObject.Solution is not null in OnStartupComplete method to handle this situation correctly.
The SolutionEvents class on MSDN includes event:
Opened: Occurs immediately after opening a solution or project.
You have in the DTE2 class a property called Events it gives a lots kind of events, for what you need you have to use:
DTE2 _applicationObject
_applicationObject.Events.SolutionEvents.Opened+=new _dispSolutionEvents_OpenedEventHandler(SolutionEvents_Opened);

Resources