Проблема состояла в том, где DLLs были расположены.
я подтвердил это путем копирования managed.dll в c:\exe and it worked without issue. По-видимому, CLR не будет искать управляемый DLLs в пути неуправляемого DLL и будет только искать его, где исполняемый файл. (или в GAC).
По причинам, в которые не стоит войти, это - структура, в которой я нуждаюсь, который означал, что я должен был дать CLR руку расположенном управляемый dll. Посмотрите код ниже:
AssemblyResolver.h:
/// <summary>
/// Summary for AssemblyResolver
/// </summary>
public ref class AssemblyResolver
{
public:
static Assembly^ MyResolveEventHandler( Object^ sender, ResolveEventArgs^ args )
{
Console::WriteLine( "Resolving..." );
Assembly^ thisAssembly = Assembly::GetExecutingAssembly();
String^ thisPath = thisAssembly->Location;
String^ directory = Path::GetDirectoryName(thisPath);
String^ pathToManagedAssembly = Path::Combine(directory, "managed.dll");
Assembly^ newAssembly = Assembly::LoadFile(pathToManagedAssembly);
return newAssembly;
}
};
Wrapper.cpp:
#include "AssemblyResolver.h"
extern "C" __declspec(dllexport) IMyObject* CreateMyObject(void)
{
try
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( AssemblyResolver::MyResolveEventHandler );
return new CMyWrapper( );
}
catch(System::Exception^ e)
{
System::Console::WriteLine(e->Message);
return NULL;
}
}
Одно слово: Организация. Разделение каждой части страницы позволит просматривать / редактировать каждую из них отдельно. Эта простая концепция очень полезна. Например, любой член команды, который хочет управлять процессом входа в систему, может легко понять, что ему нужно отредактировать login_form.phtml
, и они могут быть уверены, что редактирование login_form.phtml
будет менее вероятно чтобы непреднамеренно вмешиваться в другие функции.
В соответствии с передовой практикой я это делаю (не совсем, но аналогично).
$Title = 'Blah Blah Blah';
$User = 'Jon Miller';
$ThemeName = "MyGreenPage";
$Contents = array("User", "Login_Form");
function Include($FileName) {
if (file_exists($FileName))
include $FileName;
}
MyGreenPage.phtml
:
<html>
<head>
<title><?php echo $title; ?></title>
<?php
foreach($Contents as $Content)
Include("$Content.pcss");
?>
<?php
foreach($Contents as $Content)
Include("$Content.pjs");
?>
</head>
<body>
<?php
foreach($Contents as $Content)
Include("$Content.phtml");
?>
</body>
</html>
User.pcss
:
/* Some styles needed by User */
User.pjs
:
/* Some script needed by User */
User.phtml
:
<h3><?php echo $user; ?></h3>
Login_Form.pcss
:
/* Some styles needed by Login_Form */
Login_Form.pjs
:
/* Some script needed by Login_Form */
Login_Form.phtml
:
Вам следует ознакомиться с концепциями « макетов » и « помощников просмотра ». Хотя я связался с версией этих концепций Zend Framework, они также должны быть в других средах MVC (и концепции MVC).
Основная идея состоит в том, что «представление» вашей страницы - например, форма входа - это включены в «макет» вашего сайта - общий шаблон, который используется на всем сайте. Когда вы запрашиваете другой контроллер, с другим представлением - например, профилем пользователя - это представление также включено в тот же макет.
Чтобы включить что-то вроде формы входа на все страницы, можно использовать помощник представления. Этот помощник просмотра может отображать текущего пользователя или форму входа в систему, в зависимости от статуса входа. Помощники представления могут быть включены в макет или включены в конкретный контроллер (при условии, что инфраструктура MVC позволяет использовать какие-либо именованные сегменты рендеринга).
Двухэтапный метод включения работает лучше, чем линейное включение частей (включая заголовок , затем контент, затем нижний колонтитул - что вы делаете сейчас), потому что ваши шаблоны не должны разделять теги HTML. В руководстве Zend есть хороший наглядный пример шаблонов представлений в макете.
Чтобы включить что-то вроде формы входа на все страницы, можно использовать помощник просмотра. Этот помощник просмотра может отображать текущего пользователя или форму входа в систему, в зависимости от статуса входа. Помощники представления могут быть включены в макет или включены в конкретный контроллер (при условии, что инфраструктура MVC позволяет использовать какие-либо именованные сегменты рендеринга).
Двухэтапный метод включения работает лучше, чем линейное включение частей (включая заголовок , затем контент, затем нижний колонтитул - что вы делаете сейчас), потому что ваши шаблоны не должны разделять теги HTML. В руководстве Zend есть хороший наглядный пример шаблонов представлений в макете.
Чтобы включить что-то вроде формы входа на все страницы, можно использовать помощник просмотра. Этот помощник просмотра может отображать текущего пользователя или форму входа в систему, в зависимости от статуса входа. Помощники представления могут быть включены в макет или включены в конкретный контроллер (при условии, что инфраструктура MVC позволяет использовать какие-либо именованные сегменты рендеринга).
Двухэтапный метод включения работает лучше, чем линейное включение частей (включая заголовок , затем контент, затем нижний колонтитул - что вы делаете сейчас), потому что ваши шаблоны не должны разделять теги HTML. В руководстве Zend есть хороший наглядный пример шаблонов представлений в макете.
Помощники представления могут быть включены в макет или включены в конкретный контроллер (при условии, что инфраструктура MVC позволяет использовать какие-либо именованные сегменты рендеринга).Двухэтапный метод включения работает лучше, чем линейное включение частей (включая заголовок , затем контент, затем нижний колонтитул - что вы делаете сейчас), потому что ваши шаблоны не должны разделять теги HTML. В руководстве Zend есть хороший наглядный пример шаблонов представлений в макете.
Помощники представления могут быть включены в макет или включены в конкретный контроллер (при условии, что инфраструктура MVC позволяет использовать какие-либо именованные сегменты рендеринга).Двухэтапный метод включения работает лучше, чем линейное включение частей (включая заголовок , затем контент, затем нижний колонтитул - что вы делаете сейчас), потому что ваши шаблоны не должны разделять теги HTML. В руководстве Zend есть хороший наглядный пример шаблонов представлений в макете.
В этом проекте, над которым я работаю, все представления являются шаблонами XSL. Вместо того, чтобы передавать переменные в представление, я генерирую весь XML в контроллере и трансформирую его с помощью представления.
Мне нравится эта структура, потому что я могу хранить все свои шаблоны в одном файле и располагать их как угодно. Это также стандартный язык шаблонов, который очень гибкий и содержит массу документации. Пока это действительно хорошо работает.
Действительно хорошим примером такой структуры является веб-сайт WoW Armory (см. Источник).