В вашей «оболочке» MVC проекта Global.asax Application_Start зарегистрируйте свой пользовательский VirtualPathProvider:
HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider());
Реальная реализация будет более сложной, чем эта, потому что вы, скорее всего, сделаете некоторую основанную на интерфейсе рефлексию базы данных.поиск и т. д. в качестве средства извлечения метаданных, но это было бы общей идеей (предположим, что у вас есть другой проект MVC с именем "AnotherMvcAssembly" с контроллером Foo, а представление Index.cshtml помечено как встроенный ресурс:
public class CustomVirtualPathProvider : VirtualPathProvider {
public override bool DirectoryExists(string virtualDir) {
return base.DirectoryExists(virtualDir);
}
public override bool FileExists(string virtualPath) {
if (virtualPath == "/Views/Foo/Index.cshtml") {
return true;
}
else {
return base.FileExists(virtualPath);
}
}
public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) {
if (virtualPath == "/Views/Foo/Index.cshtml") {
Assembly asm = Assembly.Load("AnotherMvcAssembly");
return new CacheDependency(asm.Location);
}
else {
return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
public override string GetCacheKey(string virtualPath) {
return base.GetCacheKey(virtualPath);
}
public override VirtualDirectory GetDirectory(string virtualDir) {
return base.GetDirectory(virtualDir);
}
public override VirtualFile GetFile(string virtualPath) {
if (virtualPath == "/Views/Foo/Index.cshtml") {
return new CustomVirtualFile(virtualPath);
}
else {
return base.GetFile(virtualPath);
}
}
}
public class CustomVirtualFile : VirtualFile {
public CustomVirtualFile(string virtualPath) : base(virtualPath) { }
public override System.IO.Stream Open() {
Assembly asm = Assembly.Load("AnotherMvcAssembly");
return asm.GetManifestResourceStream("AnotherMvcAssembly.Views.Foo.Index.cshtml");
}
}