我有以下appDomainManager代码
public class HostAppDomainManager : AppDomainManager
{
    public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
    {
        this.InitializationFlags = AppDomainManagerInitializationOptions.RegisterWithHost;
    }
}
并遵循用于启动运行时主机的非托管代码
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ICLRMetaHost *pMetaHost       = NULL; 
    HRESULT hr;  
    ICLRRuntimeInfo *runtimeInfo = NULL;     
    __try 
    { 
        hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 
        hr = pMetaHost->GetRuntime(L"v4.0.30319",IID_ICLRRuntimeInfo,(LPVOID*)&runtimeInfo); 
        ICLRRuntimeHost *runtimeHost  = NULL; 
        hr = runtimeInfo->GetInterface(CLSID_CLRRuntimeHost,IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost);     
        ICLRControl* clrControl = NULL; 
        hr = runtimeHost->GetCLRControl(&clrControl); 
        hr = clrControl->SetAppDomainManagerType(L"ExceptionThrower.dll",L"ExceptionThrower.HostAppDomainManager");
        hr = runtimeHost->Start();  
    } 
    __except(1) 
    { 
        wprintf(L"\n Error thrown %d",e); 
    } 
    return 0; 
} 
对runtimeHost-> Start()的调用失败,错误代码为-2146233054,cansomeone指出我应该怎么做才能解决这个问题?
我需要澄清两种情况:
使用.NET 3.5编译的可执行文件需要使用使用.NET 1.1编译的库,并且库必须在1.1运行时上运行.
使用.NET 1.1编译的可执行文件需要使用使用.NET 3.5编译的库.
我找不到一个可靠的来源,说明无法加载两个版本的.NET运行时,而且微软的文档在这个问题上非常模糊.
是否可以通过托管代码抛出托管异常,但是调用堆栈中存在干预本机帧?
我在做这件事时遇到了麻烦.该应用程序是32位本机代码并托管MSCLR 2.0(但大多数代码是.NET 3.5.)
除非完成抛出,否则应用程序运行正常,并且当它抛出时究竟发生了什么取决于它运行的系统.
实际的应用程序非常复杂,所以至少在最初我会发布一些简单的概念代码只是为了说明.本机程序(我们将调用Native.exe)运行一个我们将调用的托管程序Managed.exe.某处内Managed.exe,用C#编写,如下:
class MyException : Exception {}
...
void OuterManaged()
{
    MyObject.MyEvent += ( s, a ) =>
    {
        Console.WriteLine( "Throwing..." );
        throw new MyException();
    }
    try
    {
        MyKernel.DoSomething();
        Console.WriteLine( "Finished" );
    } catch( MyException )
    {
        Console.WriteLine( "Caught" );
    }
}
MyKernel是我们将调用的混合C++/CLI程序集中定义的托管类Glue.dll.  MyObject是另一个类的实例Glue.dll.那里的相关方法看起来像这样:
void DoSomething( void )
{
    _pMyNativeKernel->DoSomething();
}
DoSomething是一个Native.exe虚拟调用的C++函数.总而言之,它最终会回归到一种Glue.dll可以提升的管理方法MyEvent …
现在可以在同一个盒子上运行两个CLR,它们怎么能互相"说话"呢?
假设GUI在.NET 2.0 CLR下运行,并且在.NET 4.0 CLR上运行了一个脚本,例如,有没有办法从4.0环境修改基于2.0的GUI?
当我使用这种技术将.NET C#REPL环境注入另一个.net进程时,我遇到了这个问题:视频:将C#DLL注入托管(C#)和非托管(C++)进程
我知道在计算机上有explorer.exe加载的托管shell扩展.我想知道什么版本的CLR加载到explorer.exe.如果我正在运行Vista或Win7,我可以使用Process Explorer并查看explorer.exe属性的.NET Assemblies选项卡.但是,这不适用于XP.有没有办法在XP上获取此信息?
我想有一个SQL Server函数dbo.GetNextNumber(),它将为每个调用生成序列号.据我所知,使用本机T-SQL函数是不可能的,因为SQL Server坚持认为函数必须是确定性的.但是,如果你能告诉我一个原生的T-SQL函数,这将真正成为我的一天.
我想也许可以使用CLR函数编写.由于CLR函数是静态的,序列号需要存储在set操作的调用上下文中,因为将其存储为静态变量将导致使用相同序列的多个连接,从而导致不那么顺序的数字.我对嵌入式CLR知之甚少,看看是否可以从CLR端访问set操作(select,update,delete,insert)调用上下文.
在一天结束时,以下查询
select dbo.GetNextNumber() from sysobjects
必须返回结果
1
2
3
4
5
如果需要另一个函数调用来重置上下文就好了
exec dbo.ResetSequenceNumbers()
为了防止一些误解并减少浪费时间回答错误问题的机会,请注意我不是在寻找一个表的ID生成函数,而且我知道一些hacks(虽然使用proc而不是函数)涉及到一些带有标识列的临时表.该ROW_NUMBER()功能是接近,但它也不会削减.
非常感谢任何回复
凯末尔
PS令人惊讶的是,SQL Server确实具有内置功能.一个函数(假设它不能在连接和where子句中使用)非常容易实现并且非常有用,但由于某种原因它不包括在内.
clr-hosting ×7
.net ×4
c# ×3
clr ×3
.net-4.0 ×1
c++ ×1
clr4.0 ×1
exception ×1
runtime ×1
sequences ×1
sql-server ×1
sqlclr ×1
version ×1
versioning ×1