我正在开展一个项目,我必须弄清楚目标计算机中安装了哪个版本的AutoCAD。我们已经考虑过存在多个版本的AutoCAD的可能性,因此,根据用户的选择,我们必须从该版本的AutoCAD动态加载所需的DLL。首先,程序会发现AutoCAD的可用版本并将其显示给用户。然后,在选择特定版本后,程序会将(例如,accoremgd.dll,acdbmgd.dll,acmgd.dll)等DLL复制到程序目录中。但是当我尝试动态加载这些dll时,它会显示以下错误:
无法加载文件或程序集' accoremgd.dll'或其中一个依赖项。找不到指定的模块。
堆栈跟踪:
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks) 在System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile,Evidence securityEvidence,Byte [] hashValue,AssemblyHashAlgorithm hashAlgorithm,Boolean forIntrospection,Boolean suppressSecurityChecks,StackCrawlMark& stackMark) 在System.Reflection.Assembly.LoadFrom(String assemblyFile) at DynamicDLLAdd.Form1.btnLoad_Click(Object sender,EventArgs e)在e:\ AutoCadOperations \ Test.AutoCadLoad_Re \ DynamicDLLAdd \ Form1.cs:第140行
我动态加载文件的子程序是:
try
{
string destFile = @Path.Combine(Environment.CurrentDirectory,"accoremgd.dll");
if (!File.Exists(destFile))
return;
Assembly a = null;
a = Assembly.LoadFrom(destFile);
AppDomain.CurrentDomain.Load(a.GetName());
MessageBox.Show("LOADED");
Type classType = a.GetType("Autodesk.AutoCAD.ApplicationService.Document");
object obj = Activator.CreateInstance(classType);
MethodInfo mi = classType.GetMethod("Create");
//rest of the code here
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
MessageBox.Show(exp.Source);
MessageBox.Show(exp.StackTrace);
}
我认为问题可能与dll的依赖关系有关。应该做什么?有没有文件或文章?
更新的 该程序的目标框架是4.0,平台目标是任何CPU。
我运行了fuselogvw.exe,我想这里可能是我的问题的一些线索。我不知道这里发生了什么,所以我添加了一张图片。如果澄清它将是一个很大的帮助。
答案 0 :(得分:1)
你不应该在你的DLL库上手动加载 AcMgd,AcCoreMgd和AcDbMgd,这些引用默认加载到AutoCAD进程(acad.exe)上(仅限acad.exe文件夹),当你NETLOAD您的DLL库(即您的插件),它将自动链接。编译DLL库时,在AutoCAD引用上设置Copy Local = FALSE。如果将其保留为TRUE,AutoCAD将出现意外行为。
此外,您不应在外部应用程序上使用AutoCAD引用(即Visual Studio上的.EXE项目)。实际上,引用是一个薄层,用于访问C ++中的实际实现(编译为.ARX动态库),并且只能在使用acad.exe的过程中工作。如果需要从外部应用程序调用AutoCAD,则可以使用COM自动化或AutoCAD控制台。 See this reply
也就是说,从AutoCAD 2012开始,您可以使用Autoloader mechanism。总之,您可以定义PackageContents.xml文件,该文件将根据客户的AutoCAD版本定义要加载的DLL库。这是将您的插件NETLOAD到AUtoCAD的最简单方法。
如果你仍然需要手动注册你的插件(DLL库),你可以创建一个registry key for it,但由于许多AutoCAD版本的垂直(例如Civil 3D,Plant 3D,Map 3D等),它有点棘手)。注册表项check more here上有一定的逻辑。
在Developer Center上查看有关AutoCAD插件开发的更多信息。
答案 1 :(得分:0)
我认为,它的问题是依赖项dll没有加载。
检查以下可能性
1)更改平台目标(AnyCPU,86,64)
2)将dll(accoremgd.dll,acdbmgd.dll,acmgd.dll)复制到以下目录
-> C:\Windows\System32
-> C:\Windows\SysWOW64
3)改变.net框架