2016-07-21 4 views
0

대상 컴퓨터에 설치된 AutoCAD의 버전을 파악해야하는 프로젝트를 진행하고 있습니다. 우리는 여러 버전의 AutoCAD가있을 가능성을 고려하여 사용자 선택에 따라 해당 AutoCAD 버전에서 필요한 DLL을 동적으로로드해야합니다. 처음에이 프로그램은 사용 가능한 AutoCAD 버전을 발견하여이를 사용자에게 보여줍니다. 그런 다음 특정 버전을 선택한 후 프로그램은 accoremgd.dll, acdbmgd.dll, acmgd.dll과 같은 DLL을 프로그램 디렉토리에 복사합니다.동적으로 AutoCAD dll을로드하는 중 예외가 발생했습니다.

Could not load file or assembly 'accoremgd.dll' or one of its dependencies. The specified module could not be found.

스택 트레이스 :

at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at 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) at System.Reflection.Assembly.LoadFrom(String assemblyFile) at DynamicDLLAdd.Form1.btnLoad_Click(Object sender, EventArgs e) in e:\AutoCadOperations\Test.AutoCadLoad_Re\DynamicDLLAdd\Form1.cs:line 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로드하려고 할 때, 그것은 오류 다음 보여줍니다 문제가 DLL의 종속성과 관련이 있다고 생각하십시오. 무엇을해야합니까? 어떤 문서 나 자료가 있습니까?

업데이트 : 프로그램의 대상 프레임 워크가 4.0이고 플랫폼 대상이 모든 CPU입니다.

나는 fuselogvw.exe를 실행했으며 내 문제에 대한 단서가 될 수 있다고 생각합니다. 나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠다. 나는 그림을 추가했다. 그것을 분명히하면 큰 도움이 될 것입니다. enter image description here

+0

"Fusion Log Viewer"(fuslogvw.exe)를 사용하여 바인딩 오류 (또는 필 요할 경우 [this] (http://stackoverflow.com/a/16049933/21567))의 로깅을 활성화하십시오. –

답변

0

나는 그 문제가 의존성 dll이로드되지 않는다고 생각합니다.

확인 다음과 같은 가능성

)

2) 86,64은 다음 디렉토리

에 넣어 (accoremgd.dll, acdbmgd.dll, acmgd.dll) DLL을 복사 1) 변경 플랫폼 대상 (anycpu를
-> C:\Windows\System32 
-> C:\Windows\SysWOW64 

3) 변경 .NET

+0

글쎄, 2 단계와 3 단계를했는데 문제가 지속되는 것 같습니다. 하지만 대상 플랫폼을 x86으로 변경하면 잘못된 형식 오류가 발생했습니다. – Skaranjit

1

당신 수동으로 Y에 AcMgd, AcCoreMgd도 AcDbMgd를로드하지 말아야 프레임 워크 우리의 DLL 라이브러리, 이러한 참조는 기본적으로 (acad.exe 폴더에서만) AutoCAD 프로세스 (acad.exe)에로드되며 DLL 라이브러리 (예 : 귀하의 플러그인), 그것은 자동으로 연결됩니다. DLL 라이브러리를 컴파일 할 때 AutoCAD 참조에서 Copy Local = FALSE를 설정하십시오. TRUE로두면 AutoCAD가 예기치 않게 작동합니다.

또한 외부 응용 프로그램 (예 : Visual Studio의 .EXE 프로젝트)에서 AutoCAD 참조를 사용하지 않아야합니다. 실제로 참조는 C++ (.ARX 동적 라이브러리로 컴파일)의 실제 구현에 액세스하는 얇은 레이어이며 acad.exe로만 처리됩니다. 외부 응용 프로그램에서 AutoCAD를 호출해야하는 경우 COM 자동화 또는 AutoCAD Console을 사용할 수 있습니다. See this reply.

즉, AutoCAD 2012부터는 Autoloader mechanism을 사용할 수 있습니다. 요약하면 고객이 가지고있는 AutoCAD 버전에 따라로드 할 DLL 라이브러리를 정의하는 PackageContents.xml 파일을 정의 할 수 있습니다. 이것이 플러그인을 AUtoCAD에 NETLOAD하는 가장 쉬운 방법입니다.

플러그인 (DLL 라이브러리)을 수동으로 등록해야하는 경우 registry key for it을 만들 수 있지만 Civil 3D, Plant 3D, Map 3D 등과 같이 많은 AutoCAD 버전의 수직 계열로 인해 약간 까다 롭습니다. 레지스트리 키에 특정 논리가 있습니다 (check more here).

Developer Center에서 AutoCAD 플러그인 개발에 대해 자세히 확인하십시오.