如何在另一个程序集中使用方法?
我有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 ***** 是的,没有问题。我做第二个项目t 好吧,为什么不现在就添加代码呢
我有两个项目。项目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;
}
效果相当好。
谢谢你,惠兹!
你的第二个dll类的开始是什么样子的?我正在获取程序集类的空值...我使用了程序集名称和类名,两者都返回 null,因此我一定缺少该类中的某些内容。
划了一下,我发现我必须使用命名空间和类:
Type assemblyClass = assembly。GetType(“C3DPortion.GetC3DScales”);
现在工作完美,再次感谢! 我很高兴我能帮助
页:
[1]