gpt4 book ai didi

c# - 使用 C# 的 CSharpScript 从另一个程序集中的字符串设置局部变量

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:42 25 4
gpt4 key购买 nike

我想在运行时分配一个 MaterialDesign 图标,以允许根据用户配置来配置按钮。

cfgvalue="PackIconKind.Ambulance";myicon.Kind = eval(cfgvalue);

我认为这可以使用这样的 Roslyn/CSharpScript 包来实现:

            PackIconKind result = 0;

CSharpScript.EvaluateAsync<PackIconKind>(cfgvalue,
ScriptOptions.Default.WithReferences("MaterialDesignThemes.Wpf")
.WithImports("MaterialDesignThemes.Wpf"))
.ContinueWith(s => result = s.Result).Wait();

myicon.Kind = result;

不幸的是 EvaluateAsync 行抛出错误:

Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Resources.ResourceManager\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Resources.ResourceManager.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Exception thrown: 'Microsoft.CodeAnalysis.Scripting.CompilationErrorException' in Microsoft.CodeAnalysis.Scripting.dll
error CS0400: The type or namespace name 'MaterialDesignThemes.Wpf.PackIconKind, MaterialDesignThemes.Wpf, Version=2.3.0.823, Culture=neutral, PublicKeyToken=null' could not be found in the global namespace (are you missing an assembly reference?)
error CS0246: The type or namespace name 'MaterialDesignThemes' could not be found (are you missing a using directive or an assembly reference?)
(1,1): error CS0103: The name 'PackIconKind' does not exist in the current context

我使用的是 .Net 4.6.1 和 Microsoft.CodeAnalysis.CSharp 2.4.0。我使用此页面作为引用: https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples

还有其他一些使用示例,但它们讨论的是使用 AddReference 和 CSharpScript 库的 1.1.1 版,因此可能不再相关。

使用这种技术可以实现我想要的吗?

提前致谢。史蒂夫

最佳答案

我遇到了同样的错误。我改变了很多东西,但这是我的最终代码。请注意,我在我的脚本中使用了“System.Windows.Point”。我的代码有点矫枉过正,但它应该适用于任何应该在您的代码上下文中运行的脚本(唯一的办法是在脚本中使用正确的用法)。

不要忘记执行“scriptOptions = scrip...”并使用“ScriptOptions”调用 Evaluate。希望能帮到您解决问题。

我的代码:

var scriptOptions = ScriptOptions.Default;

var asms = AppDomain.CurrentDomain.GetAssemblies(); // .SingleOrDefault(assembly => assembly.GetName().Name == "MyAssembly");
foreach (Assembly asm in asms)
{
scriptOptions = scriptOptions.AddReferences(asm);
}

scriptOptions = scriptOptions.AddImports("System");
scriptOptions = scriptOptions.AddImports("System.Windows");

Point[] points = await CSharpScript.EvaluateAsync<Point[]>(Code, scriptOptions);

我的脚本:

    Point[] pts = new Point[100];

for (int n = 0; n < 100; n++)
{
double x = n;
double y = 3.4 * x + 7;

pts[n] = new Point(n, y);
}

return pts;

关于c# - 使用 C# 的 CSharpScript 从另一个程序集中的字符串设置局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47433776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com