Skip to content

Commit 98220a2

Browse files
authored
Merge branch 'master' into DynamicExtendedRegistration
2 parents a51c653 + 950da5e commit 98220a2

File tree

6 files changed

+77
-19
lines changed

6 files changed

+77
-19
lines changed

Source/ExcelDna.Integration/DnaLibrary.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,11 @@ internal void AutoOpen()
330330
AssemblyLoader.GetExcelMethods(NativeAOT.MethodsForRegistration, true, _methods, _excelFunctionsExtendedRegistration);
331331

332332
// Register my Methods
333-
var allMethods = _methods.Select(i => new Registration.ExcelFunctionRegistration(i)).Concat(_excelFunctionsExtendedRegistration);
334-
ExtendedRegistration.Registration.Register(allMethods, _extendedRegistrationConfiguration);
333+
List<MethodInfo> commands = _methods.Where(Registration.ExcelCommandRegistration.IsCommand).ToList();
334+
ExcelIntegration.RegisterMethods(commands);
335+
336+
var functions = _methods.Except(commands).Select(i => new Registration.ExcelFunctionRegistration(i)).Concat(_excelFunctionsExtendedRegistration);
337+
ExtendedRegistration.Registration.Register(functions, _extendedRegistrationConfiguration);
335338

336339
// Invoke AutoOpen in all assemblies
337340
foreach (AssemblyLoader.ExcelAddInInfo addIn in _addIns)

Source/ExcelDna.Integration/Excel.cs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -758,23 +758,14 @@ internal static Guid GuidFromXllPath(string path)
758758
#endregion
759759

760760
#region ExcelLimits
761-
private static ExcelLimits _xlLimits;
762-
public static ExcelLimits ExcelLimits
761+
static readonly ExcelLimits _xlLimits = new ExcelLimits
763762
{
764-
get
765-
{
766-
if (_xlLimits == null)
767-
{
768-
_xlLimits = new ExcelLimits();
769-
770-
_xlLimits.MaxRows = 1048576;
771-
_xlLimits.MaxColumns = 16384;
772-
_xlLimits.MaxArguments = 256;
773-
_xlLimits.MaxStringLength = 32767;
774-
}
775-
return _xlLimits;
776-
}
777-
}
763+
MaxRows = 1048576,
764+
MaxColumns = 16384,
765+
MaxArguments = 256,
766+
MaxStringLength = 32767
767+
};
768+
public static ExcelLimits ExcelLimits => _xlLimits;
778769
#endregion
779770

780771
#region SupportsDynamicArrays

Source/ExcelDna.Integration/Registration/ExcelCommandRegistration.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,10 @@ public ExcelCommandRegistration(MethodInfo methodInfo)
7777
CommandAttribute = new ExcelCommandAttribute { Name = methodInfo.Name };
7878
}
7979
}
80+
81+
internal static bool IsCommand(MethodInfo methodInfo)
82+
{
83+
return methodInfo.GetCustomAttribute<ExcelCommandAttribute>() != null;
84+
}
8085
}
8186
}

Source/ExcelDna.Integration/Registration/ExcelRegistration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static IEnumerable<ExcelCommandRegistration> GetExcelCommands()
6060
return from ass in ExcelIntegration.GetExportedAssemblies()
6161
from typ in ass.GetTypes()
6262
from mi in typ.GetMethods(BindingFlags.Public | BindingFlags.Static)
63-
where mi.GetCustomAttribute<ExcelCommandAttribute>() != null
63+
where ExcelCommandRegistration.IsCommand(mi)
6464
select new ExcelCommandRegistration(mi);
6565
}
6666

Source/Tests/ExcelDna.AddIn.RuntimeTests/MyFunctions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ namespace ExcelDna.AddIn.RuntimeTests
77
{
88
public class MyFunctions
99
{
10+
[ExcelCommand(MenuText = "MyCommandHello")]
11+
public static void MyCommandHello()
12+
{
13+
Logger.Log("Hello command.");
14+
}
15+
1016
[ExcelFunction]
1117
public static string SayHello(string name)
1218
{
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using ExcelDna.Integration;
2+
using Microsoft.Office.Core;
3+
using Microsoft.Office.Interop.Excel;
4+
using Range = Microsoft.Office.Interop.Excel.Range;
5+
6+
namespace ExcelDna.RuntimeTests
7+
{
8+
public class UI
9+
{
10+
[ExcelFact(Workbook = "", AddIn = AddInPath.RuntimeTests)]
11+
public void Command()
12+
{
13+
CommandBarPopup? menu = FindPopupMenu("ExcelDna.AddIn.RuntimeTests add-in");
14+
Assert.NotNull(menu);
15+
16+
CommandBarButton? button = FindButton(menu, "MyCommandHello");
17+
Assert.NotNull(button);
18+
19+
button.Execute();
20+
21+
Range functionRange = ((Worksheet)ExcelDna.Testing.Util.Workbook.Sheets[1]).Range["B1"];
22+
functionRange.Formula = "=MyFunctionExecutionLog()";
23+
Assert.True(functionRange.Value.ToString().Contains("Hello command."));
24+
}
25+
26+
private static CommandBarPopup? FindPopupMenu(string name)
27+
{
28+
var app = (Microsoft.Office.Interop.Excel.Application)ExcelDnaUtil.Application;
29+
var controls = app.CommandBars[1].Controls;
30+
for (int i = 1; i <= controls.Count; i++)
31+
{
32+
CommandBarControl control = controls[i];
33+
if (control.Caption == name && control is CommandBarPopup menu)
34+
return menu;
35+
}
36+
37+
return null;
38+
}
39+
40+
private static CommandBarButton? FindButton(CommandBarPopup menu, string name)
41+
{
42+
CommandBarControls menuControls = menu.Controls;
43+
for (int i = 1; i <= menuControls.Count; i++)
44+
{
45+
CommandBarControl control = menuControls[i];
46+
if (control.Caption == name && control is CommandBarButton button)
47+
return button;
48+
}
49+
50+
return null;
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)