Сборка .NET не загружается из NTVDM - PullRequest
1 голос
/ 24 февраля 2009

У меня есть VDD dll, который загружается программой DOS, работающей внутри NTVDM . Эта dll использует C ++ / CLI и ссылается на сборку .NET.

В общем, процесс загрузки выглядит примерно так:

  NTVDM runs:
    prntsr.com which uses VDD RegisterModule to load:
      prnvdd.dll which references .NET assembly:
         prnlib.dll

Файлы prntsr.com, prnvdd.dll и prnlib.dll находятся в одной папке.

Однако при загрузке я получаю следующее исключение:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'PRNLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ecf23cee305e91b7' or one of its dependencies. The system cannot find the file specified.
File name: 'PRNLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ecf23cee305e91b7'
   at VDD_Initialise()

=== Pre-bind state information ===
LOG: User = DOMAIN\user
LOG: DisplayName = PRNLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ecf2
3cee305e91b7
 (Fully-specified)
LOG: Appbase = file:///C:/WINDOWS/system32/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: PRNLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ecf23cee305e91b7
LOG: Attempting download of new URL file:///C:/WINDOWS/system32/PRNLib.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/system32/PRNLib/PRNLib.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/system32/PRNLib.EXE.
LOG: Attempting download of new URL file:///C:/WINDOWS/system32/PRNLib/PRNLib.EXE.

Он только ищет C:\WINDOWS\system32\ для сборки, что, по-моему, связано с NTVDM.EXE - поскольку это фактический процесс, в который загружается сборка, он принимает свое местоположение как AppBase.

Есть идеи, как изменить AppBase или иным образом обойти эту проблему?

Ответы [ 2 ]

0 голосов
/ 07 января 2011

Вы должны добиться успеха, подключив событие AppDomain.AssemblyResolve и выполнив разрешение самостоятельно.

0 голосов
/ 07 января 2011

Не стоит пытаться использовать CLR в каждом экземпляре ntdvdm ...

Но, вероятно, будет лучше, если вы сделаете вашу сборку общей сборкой, поскольку они хранятся в стандартном месте и не ищутся относительно приложения?

...