Jeff_M 发表于 2020-4-9 12:52:32

如何在另一个程序集中使用方法?

我有2个项目,首先,我检查Civil 3D是否是当前正在运行的应用程序。如果是,我加载第二个程序集,并在其中使用一个返回单个整数的方法。如果我将第二个项目包含在第一个项目的引用中,它会工作得很好,因为可以看到名称空间和类。但是,当引用和生成C3D程序集时,它们会被复制到生成文件夹中,即使它们被设置为不复制本地。这可以防止该工具在Civil 3D之外运行(如普通Autocad),所以我需要做的是能够用反射调用那个方法,但是我很难得到正确的格式。    var assy = load extension(Name);//这是可行的,程序集已加载。
unitType = (int)assy,GetType(),InvokeMember("GetC3DScalesInt "),BindingFlags。InvokeMethod,null,assy,null);//这将失败,下面包含命名空间和类的情况也是如此。
unitType = (int)assy,GetType(),invoke member(" c3d部分。GetC3DScales.GetC3DScalesInt ",BindingFlags。InvokeMethod,null,assy,null);。
这能做到吗?我是不是找错对象了?谢谢!。
**** Hidden Message *****

huiz 发表于 2020-4-9 13:22:12

是的,没有问题。我做第二个项目t

huiz 发表于 2020-4-9 13:40:45

好吧,为什么不现在就添加代码呢
我有两个项目。项目1是主dll,项目2是仅包含在Civil 3D或Map 3D中工作的代码的dll。
项目1:不引用项目2。只创建一个新的命令或鼠标右键菜单项左右。在那里你可以检查你是否在Civil 3D中运行,如果不是,你可以显示一条很好的消息。
如果在Civil 3D中运行,可以加载单独的dll并调用所需的函数:

#if DEBUG
                  string dllFile = FileSystem.Functions.GetMyPath() + @"..\..\..\Project 2\bin\Debug\Project2.dll";
#else
                  string dllFile = FileSystem.Functions.GetMyPath() + "Project2.dll";
#endif
                  if (FileSystem.Functions.FileExist(dllFile) == false)
                  {
                        return ExportResult.ModuleNotFound;
                  }
                  // Load the dll
                  Assembly assembly = Assembly.LoadFrom(dllFile);
                  System.Type assemblyClass = assembly.GetType("Project2");
                  if (assemblyClass == null)
                  {
                        return ExportResult.ModuleNotFound;
                  }
                  // var methodInfo = t.GetMethod("MyFunction", new Type[] { typeof(int), typeof(string) });
                  MethodInfo methodInfo = assemblyClass.GetMethod("MyFunction"); // I don't use parameters here
                  if (methodInfo == null)
                  {
                        return ExportResult.FunctionNotFound;
                  }
                  // object[] constructorParameters = new object;
                  // constructorParameters = 999; // First parameter.
                  // constructorParameters = 2;   // Second parameter.
                  // Create Instance of the Class (Constructor)
                  object instance = System.Activator.CreateInstance(assemblyClass, null); // No parameters needed for the constructor so I use null
                  // Function parameters
                  object[] parameters = new object;
                  parameters = objectIds;
                  parameters = dataTable;
                  // Run Method with optional parameters (I feed it with objectids and a datatable) en get result back (in this case I return a bool)
                  bool success = System.Convert.ToBoolean(methodInfo.Invoke(instance, parameters));
                  if (success == true)
                  {
                        return ExportResult.Correct;
                  }

效果相当好。

Jeff_M 发表于 2020-4-9 14:03:50

谢谢你,惠兹!
你的第二个dll类的开始是什么样子的?我正在获取程序集类的空值...我使用了程序集名称和类名,两者都返回 null,因此我一定缺少该类中的某些内容。
划了一下,我发现我必须使用命名空间和类:
Type assemblyClass = assembly。GetType(“C3DPortion.GetC3DScales”);
现在工作完美,再次感谢!

huiz 发表于 2020-4-9 14:55:01

我很高兴我能帮助
页: [1]
查看完整版本: 如何在另一个程序集中使用方法?