did you specify ComVisible as true?

2009/7/31 CodeSpiker <keyur.a.s...@gmail.com>

>
> I am really hoping someone here helps me out. Have been struggling
> with this probelm since last 2 days now.
>
> What I am trying to do is expose a very simple .NET (C#) class to
> Excel as an addin via COM. And as I understand this is a very standard
> process.
>
> Below is the code that I am using and it all works fine on my LOCAL
> computer. i.e after all the registration etc. I am able to open up my
> excel and type in the C# function name i.e. =getname() and am able to
> see the expected value. The real issue is when I try to copy this dll
> and register it on someone else's computer it would not work.
>
> I have ensured the registry looks the same both on my and others
> computer after registering thru the regasm tool. Also on other's
> computer I am able to go into excel Tools/Add-ins and see the .NET/COM
> class that I just registered but its just when I try to fire one of
> its methods in the spreadsheet I dont see anything but the standard
> "#NAME?"
>
> So this is the following I am doing:
>
> 1. Successfully compile the class lib C# project
> 2. Generate the key pair by running sn.exe -k key.snk and modify the
> AssemblyInfo.cs appropriately and it all works fine
> 3. Once compiled I run the regasm command to generate the .tlb file
> and register to the registry: C:\>regasm TestExcelAddin.dll /
> tlb:TestExcelAddin.tlb and it all works fine
> 4. Add it to the GAC: gacutil /i TestExcelAddin.dll and that also
> works fine (since its strongly named and all)
>
> After that I go to Excel click on Tools/Add-ins/Automation and select
> my registered addin class TestExcelAddin.Test and OK and call the
> function in the spreadsheet and works fine.
>
> Now following the same procedure on someone else's computer does not
> work (they do have the same .net version and same excel version). On
> others computers I am successfully able to run all the above commands
> but its just when I type in the function in excel it shows me "#NAME?"
> instead of the value.
>
> So where am I going wrong. Please help. Below is the code for
> reference:
>
>
> namespace TestExcelAddin
>
> {
>
> [Guid("A641893E-BECE-4681-B136-D486F2B751E8")]
> [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
>
> public interface _Test
>
> {
>
> [DispId(1)]
> int GetDay();
>
> }
>
>
>
> [Guid("87C20D72-9582-4887-88EC-7CF9B84EB610")]
> [ClassInterface(ClassInterfaceType.None)]
> [ProgId("TestExcelAddin.Test")]
>
> public class Test : _Test
>
> {
> public Test(){}
>
>
> public int GetDay()
>
> { return (DateTime.Today.Day); }
>
>
>
> [ComRegisterFunctionAttribute]
> public static void RegisterFunction(Type type)
>
> {
> Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type,
> "Programmable"));
>
> RegistryKey key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type,
> "InprocServer32"), true);
>
> key.SetValue(
>
>
> "", Environment.SystemDirectory + @"\mscoree.dll",
> RegistryValueKind.String);
>
> }
>
>
>
>
> [ComUnregisterFunctionAttribute]
> public static void UnregisterFunction(Type type)
>
> {
> Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"),
> false);
> }
>
>
>
>
> private static string GetSubKeyName(Type type, string subKeyName)
>
> {
> StringBuilder s = new System.Text.StringBuilder();
>
> s.Append(
>
>
> @"CLSID\{");
>
> s.Append(type.GUID.ToString().ToUpper());
>
> s.Append(
>
>
> @"}\");
>
> s.Append(subKeyName);
>
> return s.ToString();
>
> }
>
> }
>
>
>

Reply via email to