使用.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
征诛志异,三让两家王朝;功同开辟,一桮万古江南。