Shoutbox

Installing with .NET Framework - Printable Version

-Shoutbox (https://shoutbox.menthix.net)
+-- Forum: MsgHelp Archive (/forumdisplay.php?fid=58)
+--- Forum: Messenger Plus! for Live Messenger (/forumdisplay.php?fid=4)
+---- Forum: Scripting (/forumdisplay.php?fid=39)
+----- Forum: Plug-Ins (/forumdisplay.php?fid=28)
+------ Thread: Installing with .NET Framework (/showthread.php?tid=50578)

Installing with .NET Framework by J-Thread on 09-16-2005 at 06:23 PM

There are a lot of problems with people trying to install .NET plugins... I've had them too, but I think I've finally found the right solution, so I'll post it here.

I assume you have got a plugin written in C# or VB.NET, and I'll destribe a plugin with the MessengerAPI and without. I do have Visual Studio.NET, so I'll refer to that sometimes. It is possible to do all this from the command line, but I'll not describe how.

Guid
First of all, your plugin needs a Guid. You can create a unique guid by choosing Tools -> Create Guid in VS.NET. To add the Guid to your plugin do this:

code:
VB.NET:
<Guid("936DA01F-9ABD-4d9d-80C7-02AF85C822A8")> _
Public Class MyPlugin

C#:
[Guid("936DA01F-9ABD-4d9d-80C7-02AF85C822A8")]
public class MyPlugin


Strong name
Your plugin also needs a strong name. You can generate a strong name with the tool named "sn". You have to generate a keyfile with the command:
code:
sn -k keyfile.snk
Place that in your plugin dir and then do in AssemblyInfo.cs or AssemblyInfo.vb:
code:
VB.NET:
<Assembly: AssemblyKeyFile("..\\..\\keyfile.snk")>

C#:
[assembly: AssemblyKeyFile("..\\..\\keyfile.snk")]


If you use the MessengerAPI, that needs a strong name too. Goto Project Properties > Common Properties > General > Wrapper Assembly Key File
and add our strong name key file: keyfile.snk
(thanks to n0n4m3)

Extra options
Although a lot of people say you will need the option "Register for COM Interop", it's isn't necessary. So you can leave the rest of the options default.

Interop.MessengerAPI:
If you use the Interop.MessengerAPI.dll, you should add it to the references by right clicking References and then choose Add Reference. Search the "COM" list for "Messenger API Type Library" and add this. Now you can use the MessengerAPI.

Build
Now you can compile your plugin. Your brand new plugin is outputted to the output dir. If you use the messengerAPI, there is also a dll named Interop.MessengerAPI.dll.

Installing
To install your plugin, you will have to take the following steps:
  1. Make a new directory for your plugin (I.E. C:/Program Files/MyPlugin). Let the user choose this in your setup!
  2. Copy the plugin to that dir, and if you use the MessengerAPI, also copy Interop.MessengerAPI.dll to that directory
  3. Register your plugin using regasm. The syntax is: regasm /codebase "C:/Program Files/MyPlugin/MyPlugin.dll"
  4. Add a registry value to HKEY_LOCAL_MACHINE\SOFTWARE\Patchou\MsgPlus2\RegisteredPlugins. You can choose the name yourselves (MyPlugin.dll for example) and the value should be the complete class name (namespaces.classname). For example: MyCompany.MyPlugin
  5. Let messenger reload the plugins by broadcasting the "MessengerPlus_PluginChange" value, OR exit msn at the start of the install and restart it afterwards
    [/list]

    Regasm can be found in the following directory:
    {win}\Microsoft.Net\Framework\{FrameWorkName}\RegAsm.exe

    The windows directory constant will be available in the most common installers (usualy it's C:/WINDOWS off course, but dont assume it is!) and the FrameWorkName you can get from the registry.

    My Inno Setup script I wrote for it is:
    code:
    function FrameWorkName(Param: String): String;
    var
      Names: TArrayOfString;
      I: Integer;
      FrameworkInstall: Cardinal;
    begin
      Result := '';
      if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP', Names) then begin
        for I := 0 to GetArrayLength(Names) - 1 do begin
           RegQueryDwordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\'+Names[I], 'Install', FrameworkInstall);
           if FrameworkInstall = 1 then begin
              Result := Names[I];
           end;
         end;
      end;
    end;


    I'll explain it. It loops trough the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP key backwards. If there is a key that contains the value Install and that Install value is true, you can assume that that framework version is installed or has been installed once.
    This function returns the latest framework version found and if it wasn't found, it returns an empty string.

    Finally...it works!
    I hope this tutorial helps you getting started with installing your plugin. When you have windows XP and no other plugins running, this should work (if there are no errors in your code off course).
    I haven't been able to get multiple .NET plugins running at the same time, so if you are testing, please uncheck all the other plugins because that may be the problem. I've contacted Patchou about this a couple of days ago but he didn't answer. But we all know he's a busy man.
    To let plugins with the messengerapi working, you should have windows messenger installed. In windows XP this is pre-installed, on windows 98 it isn't. So keep that in mind, it may explain weird behavior of your plugin!

RE: Installing with .NET Framework by J-Thread on 10-08-2005 at 08:11 AM

This is a double post to get my post back on the top. I did edit the one above but it still appears on page 3 so nobody will notice it's updated. When there are more replies this post can be deleted (it isn't nescessary, but I know the admins don't like double post so this one doesn't have to be added to the one above)

I've written a tutorial in installing .NET plugins, so if you got problems with it, please follow these steps!

p.s. Admin: maybe this should be a sticky post, because there are a lot of questions about this...


RE: Installing with .NET Framework by fas on 03-08-2006 at 11:51 AM

There's a better way to get the path of regasm, without scanning the registry:

string regasmPath=System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()+@"\regasm.exe";

Of course it only works if you write the installer with .NET, like me ;)

Regards


RE: Installing with .NET Framework by J-Thread on 03-08-2006 at 12:14 PM

Good point, but you need to write your installer in .NET for that, and my "trick" works with all installers...