使用.NET写Managed用户自定义函数(UDF)C#/VB.NET

这是一个UDF例程。其中只有一个自定义函数MyFunction。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace MyUDF
{
    [Guid("41B55E1A-E91E-4024-BC41-DD5292FB8CC5")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class CSharpModule
    {
        public double MyFunction(int Width,int layes,float UponRubber,
            float ButtomRubber, float Length)
        {
            return Width / 1000 * (layes + (UponRubber + ButtomRubber) / 1.5) 
                * Length;
        }

        [ComRegisterFunctionAttribute]
        public static void RegisterFunction(Type type)
        {
            Registry.ClassesRoot.CreateSubKey(
                GetSubKeyName(type, "Programmable"));
            RegistryKey key = Registry.ClassesRoot.OpenSubKey(
                GetSubKeyName(type, "InprocServer32"), true);
            key.SetValue("", System.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)
        {
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            s.Append(@"CLSID\{");
            s.Append(type.GUID.ToString().ToUpper());
            s.Append(@"}\");
            s.Append(subKeyName);
            return s.ToString();
        }

    }
}
编译前现在项目的Properties中Builder->Register for COM Interop
Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Imports System.Text

<ClassInterface(ClassInterfaceType.AutoDual)>
<ComVisible(True)>
<Guid("207DF2C7-9773-4FB1-A50C-2A2515C3F8FA")>
Public Class VBModule
    Public Function MyFunction(ByVal Width As Integer, ByVal Layes As Integer, _
                               ByVal UponRubber As Double, _
                               ByVal ButtomRubber As Double, _
                               ByVal Length As Double) As Double
        MyFunction = Width / 1000 * (Layes + (UponRubber + ButtomRubber) _
                                     / 1.5) * Length
    End Function

    <ComRegisterFunctionAttribute()> Public Shared Sub RegisterFunction(ByVal Type As Type)
        Dim rk As RegistryKey

        Registry.ClassesRoot.CreateSubKey(GetSubKeyName(Type, "Programmable"))
        rk = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(Type, "InprocServer32"), True)
        rk.SetValue("", Environment.SystemDirectory + "\mscoree.dll", RegistryValueKind.String)
    End Sub

    <ComUnregisterFunctionAttribute()> Public Shared Sub UnregisterFunction(ByVal Type As Type)
        Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(Type, "Programmable"), False)
    End Sub

    Private Shared Function GetSubKeyName(ByVal Type As Type, ByVal SubKeyName As String) As String
        Dim b As StringBuilder = New StringBuilder

        b.Append("CLSID\{")
        b.Append(Type.GUID.ToString().ToUpper())
        b.Append("}\")
        b.Append(SubKeyName)
        GetSubKeyName = b.ToString()
    End Function
End Class

编译前先选中项目的Properties中Complie->Register for COM Interop


posted @ 2012-03-08 15:27  许阳 无锡  阅读(360)  评论(0编辑  收藏  举报