2016-07-21 59 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.

はのStackTrace:

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がロードされていないと思う。可能性

1)変更プラットフォームターゲット(AnyCPU、86,64)

2)以下の

チェック(accoremgd.dll、acdbmgd.dll、acmgd.dll)のdllをコピーし、以下のディレクトリ

に入れます
-> C:\Windows\System32 
-> C:\Windows\SysWOW64 

3)変更の.NET Framework

+0

さて、私はステップ2と3を行い、問題は持続するようです。しかし、私がターゲットプラットフォームをx86に変更すると、誤ったファームウェアエラーが発生しました – Skaranjit

1

あなたは手動でY上 AcMgd、AcCoreMgdもAcDbMgdをロードするべきではありませんこれらの参照はデフォルトで(acad.exeフォルダからのみ)AutoCADプロセス(acad.exe)にロードされます。あなたのプラグイン)、自動的にリンクします。 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プラグイン開発の詳細を確認してください。

関連する問題